- 读
一事务对记录做了增删改操作,还未提交,另外一个事务产生读操作。此时第一个事务发生回滚,导致第二个事务产生脏读。 - 不可重复读
事务中发生两次读取同一条记录操作,第一次读取和第二次读取之间,另一个事务对该记录修改了,则两次读取记录不一样。 - 幻读
第一个事务对一定范围内的批量记录做了修改,第二个事务此时对该范围增加了一条数据,导致第一个数据批量修改没有完全修改。 - 数据库的隔离级别
总结:
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle
少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB
- Spring事务的隔离级别
isolation_default:默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应
isolation_read_uncommitted:这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
isolation_read_committed:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
isolation_repeatable_read:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读
isolation_serializable:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行 - Spring事务传播机制
required:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务
mandatory:支持当前事务,如果当前没有事务,就抛出异常
never:以非事务方式执行,如果当前存在事务,则抛出异常
not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
requires:新建事务,如果当前存在事务,把当前事务挂起
supports:支持当前事务,如果当前没有事务,就以非事务方式执行。
nested:外层事务嵌套内层事务,外层事务异常会回滚内层事务,内层事务失败不会影响外层事务。
PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW:它们非常 类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。