数据库事务(Transaction)
含义:通过一组逻辑操作单元(一组DML语句)将数据从一种状态转换为另一种状态。
事务可以保证多个操作原子性,要哦全部成功,要么全部失败。对于数据库来说,事务保证批量的DML要么全成功,要么全失败。
事务具有四个特征ACID:
- 原子性(Atomicity)
整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。 - 一致性(Consistency)
在事务的开始之前与结束之后,数据库都保持一致状态。 - 隔离性(Isolation)
一个事务的执行不影响其他事务的执行。 - 持久性(Durability)
在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并且不会回滚。
事务中存在的一些概念:
- 事务(Transaction):一批操作(一组DML)
- 开启事务(Start Transaction)
- 回滚事务(rollback)
- 提交事务(commit)
- 禁止或启动事务的自动提交模式(SET AUTOCOMMIT)
注意:在rollback、commit之后事务就结束了。
自动提交模式
自动提交模式用于决定新事务如何及何时启动
- • 启用自动提交模式:
–如果自动提交模式被启用,则单条DML语句将缺省地开始一个新的事务。
–如果该语句执行成功,事务将自动提交,并永久地保存该语句的执行结果。
–如果语句执行失败,事务将自动回滚,并取消该语句的结果。
在自动提交模式下,仍可使用START TRANSACTION语句来显式地启动事务。这时,一个事务仍可包含多条语句,直到这些语句被统一提交或回滚。
- 禁用自动提交模式:
–如果禁用自动提交,事务可以跨越多条语句。
在这种情况下,事务可以用COMMIT和ROLLBACK语句来显式地提交或回滚。 - 自动提交模式可以通过服务器变量AUTOCOMMIT来控制。
事务的隔离级别
隔离级别
- 事务的隔离级别决定了事务之间可见的级别
- 当多个客户端并发的访问同一个表时,可能出现下面的一致性问题
–脏读取(Dirty Read)
一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时的提交,这就出现了脏读取。
–不可重复读(Non-repeatable Read)
在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。
–幻像读(Phantom Read)
幻像读是指在同一个书屋中以前没有的行,由于其他事务的提交而出现的新行。
四个隔离级别
InnoDB实现了四个隔离级别,用以控制事务所做的修改并将修改通告至其它并发的事务。
- 读未提交(READ UNCOMMITTED)
允许一个事务可以看到其它事务未提交的修改。 - 读已提交(READ COMMITTED)
允许一个事务可以看到其它事务已经提交的修改,未提交的是不可见的。 - 可重复读(REPEATABLE READ)
确保如果在一个事务中执行两次的相同的SELECT语句都能得到相同的结果,不管其它事务是否提交这些修改。
该隔离级别为InnoDB的缺省设置 - 串行化(SERIALIZABLE)
将一个事务与其他事务完全地隔离。
通过命令动态设置隔离级别
set transaction isolation level REPEATABLE READ;