我们项目一期已经差不多结束了,所以一些细节也被拿了出来,出现最多的就是事务的操作了。因为自己负责的是一个模块(因为是另外一个项目的负责人),所以组员经常会遇到事务的问题,会出现很多奇葩的用法,各种乱用,估计他们就知道在方法上面注解@Transactional,但是其中的很多细节都不知道。所以经常会出现一个情况,就是一大坨代码出现了事务的问题,然后我就去各种改。所以今天也对事务做一个总结吧。以后忘记了可以回来看看。
一般我们使用事务最主要注重的是三个方面:
1.propagation:传播性
2:isolation:事务的隔离级别
3:readOnly是否只读
其中在单独使用不带任何参数的 @Transactional 注释时,传播模式要设置为 REQUIRED,只读标志设置为 false,事务隔离级别设置为 READ_COMMITTED,而且事务不会针对受控异常(checked exception)回滚。
传播性:
* .propagation:传播性
* <br>Propagation取值:
REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;
SUPPORTS:如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;
MANDATORY:必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;
REQUIRES_NEW:创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;
NOT_SUPPORTED:在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;
NEVER:在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException
PROPAGATION_NESTED(嵌入式事务):通过创建Savepoint实现嵌套事务,达到内层事务若抛出异常(unchecked exception)则回滚到savepoint处,但不影响外层事务;外层事务的回滚会一起回滚内层事务;
(对于spring-jdbc和mybatis有用 但是对于hibernate的sessionFactory是没有有用的)
隔离级别
* .isolation:事务的隔离级别
* spring的事务隔离级别
ISOLATION_DEFAULT:使用数据库默认的隔离级别。 spring中默认是READ_COMMITTED
ISOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
ISOLATION_READ_COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。
ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。
是否只读:
.readOnly是否只读 默认不是只读(false) 如果没有事务的时候 那么这个设置会被忽略
1.其中我们需要注意的地方是,我们在使用orm框架的时候,是需要使用事务来触发sql的执行的。所以在我们使用orm框架中都会使用事务。而且很重要的是在hibernate典型的no session错误也有一大大部分问题是出在没有添加事务。
2.第二个注意点就是说如果我们选择的策略中没有事务,那么设置了是否只读属性没有任何的作用的。
3.其他几个属性的作用:
timeout事务的响应时间 ,如果超过时间 那么就会出现错误。单位是秒
noRollbackFor:指定异常类不会回滚,在默认的情况下 事务回滚只对于RuntimeException的异常有用(只对非checked的异常回滚)
noRollbackForClassName:和上面是相同的意思 但是这里是指定异常的名称
value名称