1.什么是脏读,脏写,不可重复读,幻读
1.1.脏读和脏写实际上都是操作到了未提交的数据上导致的问题
脏读:A事务在读取数据的同时,B事务在修改数据.而A事务读取到了B事务未提交的值,如果B事务回滚了,再次读取时就发现值被回滚了.
脏写:A事务在写数据时,B事务也在写数据.A事务写在B事务的未提交版本上.B事务要反悔,所以回滚了.导致A事务也不明不白的回滚了.
1.2.不可重复读
在不会发生脏读的前提下,即读到的数据都是已提交的情况
有一个事务A是连续不断的对一条数据进行查询,
突然中间有事务B进来修改了事务并且已提交,那么事务A第二次读到的就是B事务提交之后的值,
事务C也进来修改了事务并且已提交,那么事务A第三次就会读到的是事务C提交之后的值.
从而导致每一次读取的数据都不一致,就是造成了不可重复读的现象,
但此现象可以视作问题,也可以不视作问题.要根据具体的业务而定的
1.3.幻读
事务A在查一批数据出来时,事务B在这个范围中插入了一批数据且提交了,导致了第一次查询和第二次查询出来的条数发生了变化,就是幻读
2.sql标准中的四个事务隔离级别
因为有这四大问题,所以才会有sql的四个事务隔离级别来选择
读未提交(read uncommitted):只是不会发生脏写
可能会引发脏读,不可重复读,幻读,极容易导致数据混乱 一般也不使用这个级别
读已提交(read committed) RC:不会发生脏读和脏写
可能会引发可重复读,幻读
可重复度(repeatable read) innodb默认是这个级别 RR:不会发生脏读脏写不可重复读
innodb引擎中使用mvcc解决了快照读的幻读,使用了行锁加间隙锁.锁住一部分解决了当前读的幻读
串行化(serializable):因为性能极差 一般不用这个级别
串行化不允许有多个事务并发,所以性能极差
3,spring中特殊处理某些类的事务级别
在注解中@Transactional(isolation=Isolation.DEFAULT)
DEFAULT值为mysql默认隔离级别
分别对应四个事务隔离级别的值为
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE