spring 事务嵌套调用,spring嵌套事务事务
- 数据库
- 2023-09-01
- 93
事务的传播机制和回滚策略(暂时没有整理完 1、Spring默认情况下会对运行期例外(RunTimeException ,即uncheck异常,进行事务回滚。如果遇到c...
事务的传播机制和回滚策略(暂时没有整理完)
1、Spring默认情况下会对运行期例外(RunTimeException),即uncheck异常,进行事务回滚。如果遇到checked异常就不回滚。
2、根据 REQUIRED 传播属性,如果存在事务,就加入到当前事务。两个方法都属于同一个事务,同一个事务的话,如果有发生异常,则全部都回滚。所以 a1 和 b1 都没添加成功。如果当前没有事务,则以非事务的方式运行。
3、所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。REQUIRED (默认):spring的默认传播行为。
4、因为两个方法在一个事务内,事物本身具有原子性,所以只要一个事务方法回滚,另一个也会回滚。这个传播行为是每次都开启一个事务。
5、如果当前没有事务,就创建一个新的。如果多个方法都声明了 REQUIRED ,并且他们嵌套调用,那么他们会共享同一个物理事务。就是 inner 产生了回滚,那么 outer 会跟着回滚。
spring中事物嵌套一般不超过多少层
答案当然是一本都买不到,因为 @Transactional 注解 ,默认事务的传播属性是:REQUIRED,即业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。
通常地讲,一个业务中任何一个点出错,这个业务应当被回滚。比如说转账,这个业务需要发两条SQL更新两条记录,一是更新转出者的余额,二是更新转入者余额,则需要调用两次DAO层的更新余额方法。因此,事务不能放在DAO层。
另外如果合并到外层事务,那么当内层方法回滚后,外层方法会不会回滚,这些都是由Spring事务传播性规则决定的。
目前我们的项目一般都使用Spring来管理数据库事务,而且一般都配置在Bean(Service)即业务层这一层,应该注意要保持事务的完整性,不要把一些应该放在一起的操作分散在Action这一层。
spring事务的传播机制
1、事务的传播机制,是 spring 规定的。因为在开发中,最简单的事务是,业务代码都处于同一个事务下,这也是默认的传播机制,如果出现的报错,所有的数据回滚。
2、REQUIRED (默认):spring的默认传播行为。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3、Spring默认情况下会对运行期例外(RunTimeException),即uncheck异常,进行事务回滚。如果遇到checked异常就不回滚。
Spring之Transactional注解
1、一些JTA提供者可能也支持嵌套事务。枚举,用来表示Transactional 注解的事务隔离级别,与TransactionDefinition 接口定义的事务隔离级别相一致。 枚举定义如下:DEFAULT 使用基础数据存储的默认隔离级别。
2、Transactional 只能用于 public 的方法上,否则事务会失效。如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
3、接下来,我们一起看看 @Transactional 失效的场景。
4、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。
spring+mybatis实现事务的配置
1、定义两个DAO分别使用不同的数据源,ADAO连接A数据库,BDAO连接B数据库 定义一个Service类,加上Spring注解@Transactional,表示进行事务管理。事务要配置成jta分布式事务。将ADAO和BDAO注入到Service类里面。
2、我是用:bean class=org.mybatis.spring.mapper.MapperScannerConfigurer property name=basePackage value=cn.xxxx.mail.webmail.dao.mapper/ /bean让spring自动加载mapper配置的,这个没错。
3、首先事务不是根据是不是service层而关闭的,而是你开启的session什么时候用完 在哪个层用完就关闭。
4、SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。
5、的逻辑,相当于会自动生产一个UserMapper接口的代理对象作为一个bean。
本文链接:http://www.xinin56.com/su/14012.html