sql 事务
什么是 SQL 事务?
SQL 事务(SQL transaction)指一组 SQL 操作,它们作为整体被视为一个单个工作单元(unit of work)。如果其中一条 SQL 语句失败,整个事务就会被回滚(roll back),回滚之后数据库就会回到事务开始前的状态。如果所有的 SQL 语句都执行成功,事务就会被提交(commit),并将所有的更新写入数据库。
为什么需要 SQL 事务?
在多个并发用户或进程同时访问数据库时,如果没有事务机制的支持,就可能出现一些奇怪的问题。举个例子,假设一个银行账户从 A 转账到 B,如果这个过程中出现了中断(如电力宕机、网络中断等),就可能出现情况:A 账户从中扣除了若干金额,却未能成功转移给 B 账户,此时整个系统就会出现错误。
SQL 事务的四大特性
一个 SQL 事务有四个基本特性(ACID):
原子性(Atomicity):事务在执行过程中不可分割,要么全部提交,要么全部回滚。
一致性(Consistency):事务执行前后数据的完整性约束不会被破坏,即数据库从一个一致性状态转移到另一个一致性状态。
隔离性(Isolation):一个事务的执行不应该受到其他事务的干扰。即多个事务同时执行时,每个事务都应该感觉不到其他事务的存在。
持久性(Durability):事务一旦提交,它对数据库中的数据所做的更新就会被永久保存下来,即使之后发生故障也不应该受到影响。
SQL 事务的隔离级别
SQL 事务所需的隔离级别可以根据应用场景的不同进行调整,MySQL 提供了四种隔离级别:
READ UNCOMMITTED(读未提交):允许事务读取其他事务未提交的数据,该隔离级别会导致“脏读”、“幻影读”等问题。
READ COMMITTED(读已提交):只允许事务读取其他事务已经提交的数据,但是同一个事务的两次查询可能读到不同的数据,即“不可重复读”问题。
REPEATABLE READ(可重复读):在一个事务内,多次读取同一个数据结果都是一样的,但是会出现“幻影读”问题,即一次查询中返回的数据行,与另一次查询中返回的数据行不同时。
SERIALIZABLE(可串行化):保证所有事务都能序列化执行,避免了脏读、不可重复读、幻影读等问题,但是会导致并发性能下降。
如何使用 SQL 事务?
以下是使用 SQL 事务的常见模式:
- 打开事务(BEGIN TRANSACTION)。
- 执行一组 SQL 语句(INSERT、UPDATE、DELETE)。
- 根据需要,进行一些额外的数据检查和操作。
- 如果所有的 SQL 语句都执行成功,就提交事务(COMMIT TRANSACTION),否则就回滚事务(ROLLBACK TRANSACTION)。
- 关闭连接。
需要注意的是,只有在 InnoDB 引擎下,MySQL 才会支持事务。另外,在使用事务时,一定要小心异常情况的处理,避免出现余波。