一、事务的四大特性
- 原子性
原子性是指事务包含的操作要么全部成功,要么全部失败回滚。 - 一致性
一致性是指事务必须使数据库从一个一致性状态变换为另一个一致性状态,也就是说事务执行之前和执行之后都必须处于一致性状态。以A、B两个用户转账为例,无论如何转账,两个用户的总金额和是不变的。 - 隔离性
隔离性是指当多个用户访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务所干扰,多个并发事务之间的操作是相互隔离的。 - 持久性
持久性是指一个事务一旦被提交成功,那么对数据库中的数据修改是永久性的。即使在遇到故障的情况下也不会丢失提交事务的操作。
二、并发事务带来的四个问题
-
读未提交
指数据库访问中,有两个事务读入同一数据并修改,后修改事务提交的结果覆盖了前事务提交的结果,导致前事务的修改被丢失。 -
脏读
指数据库访问中,一个事务A对数据进行了修改,并将其写入磁盘但并未提交,另一个事务B读取了该数据,此时事务A发送了异常,而回滚了事务。这是事务B读取到的数据即是个“脏”数据,即产生了脏读。 -
不可重复读
指数据库访问中,同一个事务对一个数据进行多次读取,在该事务的两次读数据之间,另一个事务对该数据进行了修改,导致该事务两次读取的数据不一致,因此称为不可重复读。即在一个事务范围内两次相同的查询读取的数据是不一样的,我们就称为是不可重复读。 -
幻读
指数据库访问中,事务A对某条件下的记录数进行查询时,有另一个事务B对该条件下的记录新增了一条,事务A再次查询该记录数时,读取的记录变化了,此时产生了幻读。
Tip:
这里需区分开不可重复读与幻读。前者是指事务对同一数据的再次访问时,读取到的值不一样了;而后者是指同样的条件,第1次和第2次读出来的记录数不一样了。
三、数据库事务隔离级别的介绍
数据库事务提供了4种隔离级别,以下4个隔离级别逐个解决了脏读、不可重复读和幻读这几个问题。
- 读未提交数据
允许事务读取未被其他事务提交的变更,可能有脏读、不可重复读、幻读的问题。 - 读已提交数据
允许事务读取已经被其他事务提交的变更,可以避免脏读,可能有不可重复读、幻读的问题。 - 可重复读(Mysql的默认隔离级别)
确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读与不可重复读,可能会有幻读。 - 可串行化
所有事务都一个接一个地串行执行,可以避免脏读、不可重复读、幻读的问题。
链接:
Transaction那些事儿:https://my.oschina.net/huangyong/blog/160012