zl程序教程

您现在的位置是:首页 >  后端

当前栏目

spring的声明式事务

Spring事务 声明
2023-09-14 09:00:23 时间
事务的传播特性 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事


http://www.blogjava.net/robbie/archive/2009/04/05/264003.html




事务的传播特性

在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。
如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。事务的传播特性就是解决这个问题的,“事务是会传播的”在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新的事务。这个工作使由Spring来帮助我们完成的。
以前没有Spring帮助我们完成事务的时候我们必须自己手动的控制事务,例如当我们项目中仅仅使用hibernate,而没有集成进spring的时候,我们在一个service层中调用其他的业务逻辑方法,为了保证事物必须也要把当前的hibernate session传递到下一个方法中,或者采用ThreadLocal的方法,将session传递给下一个方法,其实都是一个目的。现在这个工作由spring来帮助我们完成,就可以让我们更加的专注于我们的业务逻辑。而不用去关心事务的问题。

默认情况下当发生RuntimeException的情况下,事务才会回滚,所以要注意一下如果你在程序发生错误的情况下,有自己的异常处理机制定义自己的Exception,必须从RuntimeException类继承这样事务才会回滚


配置@Transactional(rollbackFor=Exception.class)

即使是抛出的是非运行时异常也会回滚

wKiom1XpW7_QnRlvAAK_S_ySnUo117.jpg


参考文章:

http://blog.sina.com.cn/s/blog_6b338038010109tm.html


使用spring声明式事务的几个步骤:

       1. applicationContext.xml中进行配置

 

  !-- 配置事务管理器 -- 

  bean id="transactionManager"

   property name="sessionFactory" ref="sessionFactory" / 

  /bean 

  !-- 那些类那些方法使用事务 -- 

  aop:config proxy-target- 

   aop:pointcut expression="execution(* com.chinaseacom.store.common.BaseService.*(..) ) or 

         execution(* com.chinaseacom.store.common.StartupListener.*(..) ) or 

         execution(* com.chinaseacom.store.customer.service.*.*(..)) 

         " 

       id="pointcut" / 

   aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" / 

  /aop:config 

 !-- 事务的传播特性 -- 

  tx:advice id="txAdvice" transaction-manager="transactionManager" 

   tx:attributes 

    tx:method name="*" read-only="true" /      !--剩下的方法-- 

    tx:method name="get*" read-only="true" / 

    tx:method name="load*" read-only="true" / 

    tx:method name="find*" read-only="true" / 

    tx:method name="save*" propagation="REQUIRED" / 

    tx:method name="update*" propagation="REQUIRED" / 

    tx:method name="del*" propagation="REQUIRED" / 

   /tx:attributes 

  /tx:advice 

 


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1691340


Spring声明式事务开发 1.Spring事务 一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。 一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。并且支持 @Transactional 注解和 AOP 风格的配置。在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session
声明式事务测试 :Spring注解笔记系列(一) 事务拦截器:先获取事务相关的一些属性,再来获取PlateformTransactionManager,如果事先没有添加任何指定TransactionManager,最终会从容器中按照类型获取一个PlateformTransactionManager
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载