事务隔离

事务特性:ACID
Atomicity 原子性
Consistency 一致性
Isolation 隔离性
Durablity 持久性

脏读dirty-read:针对update,事务1更新了记录,但没有提交,事务2读取了更新后的行,然后事务T1回滚,现在T2读取无效。
不可重复读unrepeatable read:针对update,事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录,那么在事务2提交前后事务1读取数据不一致
幻读phantom read:针对插入删除记录,事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录,在同一事务里读的数据记录增加/减少,会有混乱而无法处理;

不可重复读与幻读主要区分依据是另一事务是进行update还是增删操作

事务的隔离机制:级别越高越安全,效率越低,主要是根据事务的提交时间,对线程的加锁范围程度来区分
1.read-uncommitted
其它线程会读到未提交数据,如果另一个线程回滚,这个线程数据就读错了,会有dirty-read, non-repeatable read , phantom-read
2.read-committed(一般设定)
一个线程提交数据其它线程才能读,避免脏读,但是会有non-repeatable read (事务1读取中有另一事务刷新数据并提交造成事务1读取混乱), phantom-read(事务1读取中有另一事务增删数据并提交造成事务1读取混乱)
4.repeatable-read
给读的数据加锁,避免脏读,其它线程不能更新此条数据,不会有unrepeatable read,但是会有其他数据插入删除,就会有plantom read
8.serializable
不允许事务并发,不会出现以上问题

一般情况不考虑phantom read,因为一般不会再插入删除前后读两次数据
悲观锁,乐观锁问题是解决read-committed情况下的不可重复读问题
悲观锁:在读数据时请数据库为读的数据加锁,提交前不许别人更新
乐观锁:自己在记录上加一个字段作为标记@Version,看是不是更新了,其它事务在读取前后检查这个标记,如果出现不可重复读问题会报错

原文地址:https://www.cnblogs.com/atongmumu/p/6550973.html