Spring的事务操作


我们项目一期已经差不多结束了,所以一些细节也被拿了出来,出现最多的就是事务的操作了。因为自己负责的是一个模块(因为是另外一个项目的负责人),所以组员经常会遇到事务的问题,会出现很多奇葩的用法,各种乱用,估计他们就知道在方法上面注解@Transactional,但是其中的很多细节都不知道。所以经常会出现一个情况,就是一大坨代码出现了事务的问题,然后我就去各种改。所以今天也对事务做一个总结吧。以后忘记了可以回来看看。

一般我们使用事务最主要注重的是三个方面:

  1.propagation:传播性 
  2:isolation:事务的隔离级别
  3:readOnly是否只读

  其中在单独使用不带任何参数的 @Transactional 注释时,传播模式要设置为 REQUIRED,只读标志设置为 false,事务隔离级别设置为 READ_COMMITTED,而且事务不会针对受控异常(checked exception)回滚。

传播性:

 *    3.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是没有有用的)

隔离级别

 *    1.isolation:事务的隔离级别
 *            spring的事务隔离级别
            ISOLATION_DEFAULT:使用数据库默认的隔离级别。 spring中默认是READ_COMMITTED
            ISOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
            ISOLATION_READ_COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
            ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。
            ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。

是否只读:

6.readOnly是否只读  默认不是只读(false)  如果没有事务的时候 那么这个设置会被忽略

1.其中我们需要注意的地方是,我们在使用orm框架的时候,是需要使用事务来触发sql的执行的。所以在我们使用orm框架中都会使用事务。而且很重要的是在hibernate典型的no session错误也有一大大部分问题是出在没有添加事务。
2.第二个注意点就是说如果我们选择的策略中没有事务,那么设置了是否只读属性没有任何的作用的。
3.其他几个属性的作用:

    timeout事务的响应时间 ,如果超过时间 那么就会出现错误。单位是秒
    noRollbackFor:指定异常类不会回滚,在默认的情况下  事务回滚只对于RuntimeException的异常有用(只对非checked的异常回滚)
    noRollbackForClassName:和上面是相同的意思  但是这里是指定异常的名称
  value名称

Spring中如何配置Hibernate事务

Struts2整合Spring方法及原理

基于 Spring 设计并实现 RESTful Web Services

Spring-3.2.4 + Quartz-2.2.0集成实例

使用 Spring 进行单元测试

运用Spring注解实现Netty服务器端UDP应用程序

Spring 3.x 企业应用开发实战 PDF完整高清扫描版+源代码

Spring 的详细介绍:请点这里
Spring 的下载地址:请点这里

本文永久更新链接地址

相关内容