事务存在的问题
- 脏读:T1读取到了T2未提交的数据,这样会导致T2回滚后,再在T1里读取,得到不同的结果
- 重复读(不一致读):T1重复读取同一条数据,T2在期间做了更新操作,导致读取到的数据不一致
- 幻读:T1重复读取记录,T2在期间插入了数据,导致读取到数据量不一致
重复读针对的是同一条记录的更新、删除操作,幻读是针对数据的插入。原因在于锁的控制,要避免重复读,只需要在T1中为读取到每一行数据加锁,避免其他事务对记录进行更新,而对于插入操作,由于是新纪录,无法加锁,所以需要的隔离级别需要再次升级。
事务隔离级别
参考:https://blog.csdn.net/lanxinglan/article/details/51953304
ReadUncommited
实现原理:1.事务在读取时不对行加任何锁;2.事务更新时对数据加行级共享锁;
存在的问题:脏读、重复读、幻读
ReadCommited
实现原理: 1.读取时加行级共享锁,读取完即释放;2.更新时加排它锁,共享锁和排它锁互斥,所以必须等到事务提交后才能读取;
存在的问题:重复读、幻读
ReadRepeated
实现原理:1.读取时加行级锁,直到事务结束释放;2.更新时加排它锁,由于互斥,在读取时不能进行更新操作,也就保证了读取的事务获取到的数据不会出现不一致的现象;
存在的问题:幻读
Serializable
实现原理:1.读取时加表级共享锁;2.更新、插入时加表级排它锁;由于互斥,在读取时不能进行插入操作,从而避免幻读;