spring事务和mysql的隔离级别
Read Uncommitted:所有事务都可以看到其他未提交事务的执行结果。
会导致【脏读Drity Read】:读了错误的数据。Read Uncommitted隔离级别时,b事务可以读取另外a事务未提交的数据,如果a事务rollback,则b事务读取的数据是错误的。
Read Committed:一个事务只能看见已经提交事务所做的改变。
会导致【不可重复读Non-repeatable read】:两次读的某条数据不一致。Read Committed隔离级别时,在一个事务的两次查询之间,其他事务提交并更新了该条数据,导致两次查询的数据不一致。
Repeatable Read:同一个事务中多次读取相同的数据返回的结果是一样的。MySQL的默认事务隔离级别,一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且,该事务不要求与其他事务是“可串行化”的。
在当前事务提交之前,其它不论什么事务均不能够改动或删除当前事务已读取的数据。并发性低于 READ COMMITTED。由于已读数据的共享锁在整个事务期间持有,而不是在每一个语句结束时释放。
会导致【幻读Phantom Read】:当用户读取某范围数据行时,另一事务在此范围内插入新行,当用户再次读取此范围数据行时,读取到新的幻影行。
Serializable:最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
注意⚠️:不可重复读重点在于update和delete,而幻读的重点在于insert。
重点:InnoDB引擎中Repeatable Read的实现原理。
手动测试,mysql里没有出现幻读的问题。
spring事务的七种隔离级别如下:
当存在一个事务时,则支持当前事务,如果没有事务则:1、开启新事务。2、非事务执行。3、抛出异常。
总是开启一个新事务
总是非事务执行,如果当前事务存在:1、挂起该事务。2、抛出异常。
PROPAGATION_NESTED 如果活动事务存在,则运行在嵌套事务中,如果没有活动事务,则安装PROPAGATION_REQUIRED运行