一、事务传播属性(propagation)
1、REQUIRED,默认属性
此级别下,会为每一个调用的方法创建一个逻辑事务域,如果前面的方法已经创建了事务,那么后面的方法支持当前事务,如果当前没有事务,会重新建立事务
2、MANDATORY(务必的)
支持当前事务,如果没有则抛异常
3、NEVER
非事务执行,如果有事务则抛异常
4、NOT_SUPPORTED
非事务操作,如果有事务则挂起
5、REQUIRES_NEW
新建事务,如果当前存在事务则挂起当前
6、SUPPORTS
支持当前事务,如果没有当前事务,则以非事务方式执行
7、NESTED(镶嵌)
支持当前事务,新增SavePoint点,与当前事务同步提交或回滚。
嵌套事务就是内层事务依赖于外层事务,外层事务失败,回滚内外层事务,内层事务失败,不影响外层事务
二、事务隔离级别(Isolation Level)
事务并发引起的三种情况
1、Dirty Reads 脏读
一个事务对数据进行更新操作还未提交,另一个事务也来操作这个未提交数据,如果第一个事务操作失败,数据回滚了,而第二个事务用了未提交的数据,也就是用了错误数据,就造成了脏读
如果第一个事务向数据库插入一条数据,还有后期操作所以没有提交,第二个事务在第一个事务没提交的情况下读取了第一个事务插入的数据,如果第一个事务后期操作出问题了,那么数据回滚,这导致第二个事务取错了数据,也就是脏读
2、Non-Repeatable Reads 不可重复读
一个事务要多次读取同一数据,该事务还未结束时,另一个事务就对那个数据做了修改,那么第一个事务本该读到的是同样数据,被第二个事务修改后就多到的不同了,造成不可重复读
3、Phantom Reads 幻读
第一个事务在查询符合某条件数据时,此时另一事务插入一条符合条件的新数据,第一个事务就感觉莫名多了一条,仿佛出现幻觉,就叫幻读
4、不可重复读和幻读区别:
不可重复读是在同一事物中多次查询,而过程中其他事物对数据做了修改或删除,返回不同的结果
幻读在同一事物中多次查询,而过程中其他事物做了插入操作,得到不同结果
表面上看区别是不可重复读是其他事务对数据修改或删除造成的问题,幻读是其他事务对数据进行插入造成的问题
五种隔离级别
1、DEFAULT 默认
使用的是数据库默认设置的隔离级别,依赖于数据库事务
2、READ_UNCOMMITTED 读未提交
事务最低隔离级别,允许另外事务可以看到未提交数据,容易造成脏读、不可重复读和幻读
3、READ_COMMITTED 读已提交
保证已修改的数据提交后才能被另外事务读取到,另外事务不能读取未提交数据,避免了脏读,不可避免不可重复读和幻读
4、REPEATABLE_READ 可重复读
防止脏读和不可重复读,可能出现幻读
5、SERIALIZABLE 串行化
花费代价最高,事务被处理为顺序执行,脏读、不可重复读、幻读均可避免