美文网首页
Spring事务

Spring事务

作者: bigfish1129 | 来源:发表于2018-05-30 11:11 被阅读0次

Spring 事务

分类

Spring可以支持编程式事务和声明式事务。

编程式事务

实现

Spring使用事务管理器,每个不同平台的事务管理器都实现了接口:PlatformTransactionManager
此接口是事务管理的核心,提供了三个需要实现的函数:

commit(TransactionStatus status) ;     
getTransaction(TransactionDefinition definition) ;     
rollback(TransactionStatus status) ;

如果我们使用的是JDBC来处理事务,那么这个事务管理器就是DataSourceTransactionManager。
通过Spring文档查找到这个类,发现其需要DataSource这个类。也就是只要实现了javax.sql.DataSource这个接口的类,都可以作为参数传入到DataSourceTransactionManager。
然后,找到 包org.springframework.transaction.support中的 TransactionTemplate。
发现TransactionTemplate中有一个重要的方法:

execute(TransactionCallback action) ;  

就是利用这个方法,我们可以在这个方法中添加事务。
这个方法需要传入参数 TransactionCallback。
TransactionCallback,顾名思义,就是事务回调然后查到TransactionCallback。
发现这是一个接口(这也必须是接口,因为任务都是自己具体定义的)
里面只有一个方法:

doInTransaction(TransactionStatus status) ;   

很明显,就是在一个事务中需要做的事情都包括这这个方法中了。
而这个doInTransaction 又传入了一个参数,这次是 TransactionStatus,继续顾名思义,也就是事务状态。
查询下去,这个 TransactionStatus 还是一个接口。

是否需要返回值

void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。

声明式事务

  1. 声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。

  2. Spring的AOP实现方式有两种:1、Java代理方式;2、Cglib动态增强方式,这两种方式在Spring中是可以无缝自由切换的。Java代理方式的优点是不依赖第三方jar包,缺点是不能代理类,只能代理接口。

实践

XML

    <!-- (必须):事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" >
        <property name="transactionManager" ref="transactionManager" />
        <!--ISOLATION_DEFAULT 表示由使用的数据库决定  -->
        <property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
    </bean>

代码

try {
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                @Override
                public void doInTransactionWithoutResult(TransactionStatus ts) {
                    Service.batchUpdate(DOList);
Service.edit(Bill);
                }
            });
        } catch (Exception e) {
            logger.error("Service.batchCreat or Service.create error transaction "
                + "rollback");
            transactionTemplate.execute(new TransactionCallbackWithoutResult() {
                @Override
                public void doInTransactionWithoutResult(TransactionStatus ts) {
                    Service.batchUpdate(DOList);
Service.edit(Bill);
                }
            });
        }

checked异常和unchecked异常

这里之所以让大家清楚checked异常和unchecked异常概念,是因为:
Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。

checked异常:

表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。
必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。
继承自java.lang.Exception(java.lang.RuntimeException除外)。

unchecked异常:

表示错误,程序的逻辑错误。是RuntimeException的子类,比如IllegalArgumentException, NullPointerException和IllegalStateException。
不需要在代码中显式地捕获unchecked异常做处理。
继承自java.lang.RuntimeException(而java.lang.RuntimeException继承自java.lang.Exception)。

使用注意事项

  1. 通过 元素的 “proxy-target-class” 属性值来控制是基于接口的还是基于类的代理被创建。如果 “proxy-target-class” 属值被设置为 “true”,那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 “proxy-target-class” 属值被设置为 “false” 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。

  2. @Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的

参考文献

相关文章

  • 关于事务的思考

    Spring对于事务的支持 Spring事务接口 Spring事务管理器 Spring并不直接管理事务,而是提供多...

  • Spring事务

    Spring 事务 分类 Spring可以支持编程式事务和声明式事务。 编程式事务 实现 Spring使用事务管理...

  • Spring中实现事务方式

    Spring 中实现事务的方式 Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,...

  • Spring事务的传播特性引发的一场血案

    Spring事务的传播特性是对于Spring事务管理的一项特殊配置;Spring事务基于Spring AOP特性,...

  • Spring 事务实现分析

    1. Spring 事务简介 Spring 本身并不实现事务,Spring事务 的本质 还是 底层数据库 对事务的...

  • spring04

    Spring JdbcTemplate学习 Spring 声明式事务 xml配置实现 Spring 声明式事务 注...

  • 程序员之Spring

    1. Spring事务 spring的事务实现原理Spring事务将connection放入到当前线程的threa...

  • 面前温习

    Spring事务传播特性的浅析——事务方法嵌套调用的迷茫 解惑 spring 嵌套事务

  • 分布式事务(2)Spring事务

    2.1 Spring事务原理 Spring支持编程式事务和声明式事务。编程式事务就是用个事务类Transactio...

  • spring事务的实现原理

    spring实现事务的原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring...

网友评论

      本文标题:Spring事务

      本文链接:https://www.haomeiwen.com/subject/ghstsftx.html