为什么会出现“脏读”?因为没有“select”操作没有规矩。
为什么会出现“不可重复读”?因为“update”操作没有规矩。
为什么会出现“幻读”?因为“insert”和“delete”操作没有规矩。
Oracle支持两种事务隔离级别:READ COMMITTED(默认事务隔离级别),SERIALIZABLE(序列化)
MySQL支持四种事务隔离级别:REPEATABLE READ(默认事务隔离级别)
上面介绍的是Mysql的事务隔离级别,那跟spring中的事务隔离级别有什么必然的联系呢?
spring就是对数据库事务进行了封装而已,并提了5种事务隔离级别和7种事务传播机制:
5种事务隔离级别
ISOLATION_DEFAULT
spring将使用数据库中默认的事务隔离级别。
下面四种定义和上面一致。
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
7种事务传播机制
REQUIRED
如果当前方法有事务则加入事务,没有则创建一个事务。
NOT_SUPPORTED
不支持事务,如果当前有事务则挂起事务运行。
REQUIREDS_NEW
新建一个事务并在这个事务中运行,如果当前存在事务就把当前事务挂起。
新建事务的提交、回滚 与 挂起事务 没有联系,不会影响挂起事务的操作。
MANDATORY
强制当前方法使用事务运行,如果当前没有事务则抛出异常。
NEVER
当前方法不能存在事务,即非事务状态运行,如果存在事务则抛出异常。
SUPPORTS
支持当前事务,如果当前没事务,也支持非事务状态运行。
NESTED
如果当前存在事务,则在嵌套事务内执行。嵌套事务的提交、回滚 与 父事务没有任何关系,反之,当父事务提交嵌套事务也一起提交,父事务回滚也回滚嵌套事务。
如果当前没有事务,则,新建一个事务运行,这时候则与PROPAGATION_REQUIRED场景一致。