1 事务的ACID特性
①原子性。事务的全部操作要么全部执行成功,要么全部失败。
②一致性。事务开始及结束时,数据都保持一致性(正确的)状态。例如,微信转账不可以一边扣款,另一边无变化。
③隔离性。数据库提供一定的隔离机制保证事务不受其他事务的影响。即事务的操作对外部是不可见的。
④持久性。事务提交之后,对数据库的影响是永久的。
2 并发事务带来的问题
①更新丢失。两个事务同时对一个数据进行修改,原数据是100,A进行减90,B减20。A和B各自的操作是读数据,之后减数据,写回。可能的情况是:A、B读数据100;A - 90,写回数据变为10;之后B - 20,写回数据变为80。A修改的数据就丢失了。
②脏读。例如,微信购物。把微信购物做成一个事务:销售方先对库存减去购物的数量,之后再由用户去付款,如果用户的金额低于需要销售的金额就回滚。共有120件商品,A进购100件商品,之后B去买50件,发现低于不买。但A发现自己没那么多钱,于是也放弃购买。这就是脏读。B读取到了事务A未提交的数据。
③不可重复度。一次事务前后读取到的数据不一样。
脏读和不可重复读的区别:脏读读的是未提交的数据。不可重复读读的是已提交的数据。
④幻读。一次事务中查询时该位置没有数据(或有数据),但在插入时却发现有数据(删除/修改时没有数据)。
不可重复读和幻读的区别:不可重复读指的是一次事务前后相同条件读取数据不一致。幻读指的是前面读取数据是没有的(或有的),但在增加(修改/删除)时发现数据是有的(没有的)。本质是,不可重复读两次都为读;幻读是第一次读,第二次对数据操作发现和读取的不符合(像做梦一样,所以叫幻读)。
3 并发事务的隔离级别
①读未提交。无需任何手段。
②读已提交。可以避免脏读。
快照读:MVCC处理(每次进行快照读时生成新的readview,因此有不可重复读问题)
当前读:RC隔离级别保证对读取到的记录加锁(记录锁),存在幻读。
③可重复读。Mysql默认隔离级别。避免脏读和不可重复读。
快照读:MVCC处理(只有第一次进行快照读时才会生成readview,之后的读操作都会使用第一次生成的readview)
当前读:RR隔离级别保证对读取到的记录加锁(记录锁),同时保证对读取的范围加锁(间隙锁),使新的满足查询条件的记录不能够插入 ,不存在幻读现象!
④可串行化。可以避免脏读、不可重复读和幻读。
相关资料:(1条消息) 从因到果看懂事务隔离级别的实现原理_:“来都让一让”的博客-CSDN博客_事务隔离级别的实现原理