首页 > 编程知识 正文

spring的事务是如何配置的,spring默认事务传播机制

时间:2023-05-06 12:59:29 阅读:26591 作者:4183

前言

Spring在TransactionDefinition接口上规定了7种事务传播行为。 事务传播行为是Spring框架特有的事务扩展,它是事务不属于的实际提供程序数据库行为。 这是Spring提供的强大工具箱,事务传播线可以为开发工作提供很多便利。 但是,对他的误解也很多,应该听过“最好不要嵌套服务方法的事务”的传言吧。 正确使用工具首先要了解工具。 本文详细介绍了七种事务传播行为,并给出了内容主要代码示例的方法。

基础概念

1 .什么是事务传播行为?

事务传播行为用于描述由一个事务传播行为限定的方法嵌套在另一个方法中时事务是如何传播的。

用伪代码说明:

水平。

嵌套调用代码中的methodA (方法为methodB )方法,methodB ) )的事务传播行为由@transaction (传递) propagation=XXX )设置决定。 需要注意的是,methodA ) )没有打开事务。 事务传播行为修饰的方法不需要在打开事务的外围方法中调用。

2. Spring中的7个事务传播行为

水平。

因为定义非常简单,容易理解,所以进入代码测试部分,验证理解是否正确。

代码验证

这篇文章用传统三层结构(Service层和Dao层)中的两层来表示代码。 Spring负责依赖注入和注释的事务管理,而Dao层由Mybatis实现。 例如,可以使用任何喜欢的方法,如Hibernate、JPA或JDBC模板。 数据库正在使用MySQL数据库。 也可以使用支持事务的任何数据库,而不影响验证结果。

首先在数据库中创建两个表。

用户1

水平。

用户2

水平。

然后编写相应的Bean和DAO层代码。

用户1

水平。

用户2

水平。

用户1映射器

水平。

用户2映射器

水平。

最后,具体验证的代码由服务层实现。 以下按情况列举。

1.PROPAGATION_REQUIRED

已将Propagation.REQUIRED属性添加到与User1Service和User2Service对应的方法中。

user 1服务方法:

水平。

user 2服务方法:

水平。

1.1场景1

此场景的外围方法没有打开事务。

验证方法1 :

水平。

验证方法2 :

水平。

分别运行验证方法,结果:

水平。

结论:通过这两种方法,Propagation.REQUIRED限定的内部方法在外围方法没有打开事务的情况下打开新事务,打开的事务相互独立,相互不干扰

1.2场景2

用周边的方法开始事务。 这是使用率很高的场景。

验证方法1 :

水平。

验证方法2 :

水平。

验证方法3 :

水平。

分别运行验证方法,结果:

水平。

结论:以上实验结果表明,Propagation.REQUIRED修饰的内部方法添加到外围方法的事务中,所有Propagation.REQUIRED修饰的内部方法和外围方法属于同一事务,只有一个方法

2.PROPAGATION_REQUIRES_NEW

将Propagation.REQUIRES_NEW属性添加到User1Service和User2Service的相应方法中。

user 1服务方法:

水平。

user 2服务方法:

水平。

2.1场景1

外围方法没有打开事务。

验证方法1 :

.

验证方法2:

.

分别执行验证方法,结果:

.

结论:通过这两个方法我们证明了在外围方法未开启事务的情况下Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。

2.2 场景二

外围方法开启事务。

验证方法1:

.

验证方法2:

.

验证方法3:

.

分别执行验证方法,结果:

.

结论:在外围方法开启事务的情况下Propagation.REQUIRES_NEW修饰的内部方法依然会单独开启独立事务,且与外部方法事务也独立,内部方法之间、内部方法和外部方法事务均相互独立,互不干扰。

3.PROPAGATION_NESTED

3.1 场景一

此场景外围方法没有开启事务。

验证方法1:

.

验证方法2:

.

分别执行验证方法,结果:

.

结论:通过这两个方法我们证明了在外围方法未开启事务的情况下Propagation.NESTED和Propagation.REQUIRED作用相同,修饰的内部方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。

3.2 场景二

外围方法开启事务。

验证方法1:

.

验证方法2:

.

验证方法3:

.

分别执行验证方法,结果:

.

结论:以上试验结果我们证明在外围方法开启事务的情况下

Propagation.NESTED

修饰的内部方法属于外部事务的子事务,外围主事务回滚,子事务一定回滚,而内部子事务可以单独回滚而不影响外围主事务和其他子事务

4. REQUIRED,REQUIRES_NEW,NESTED异同

由“1.2 场景二”和“3.2 场景二”对比,我们可知:

NESTED和REQUIRED修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。但是REQUIRED是加入外围方法事务,所以和外围事务同属于一个事务,一旦REQUIRED事务抛出异常被回滚,外围方法事务也将被回滚。而NESTED是外围方法的子事务,有单独的保存点,所以NESTED方法抛出异常被回滚,不会影响到外围方法的事务。

由“2.2 场景二”和“3.2 场景二”对比,我们可知:

NESTED和REQUIRES_NEW都可以做到内部方法事务回滚而不影响外围方法事务。但是因为NESTED是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。而REQUIRES_NEW是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。

5. 其他事务传播行为

鉴于文章篇幅问题,其他事务传播行为的测试就不在此一一描述了,感兴趣的读者可以去源码中自己寻找相应测试代码和结果解释。

结论

通过上面的介绍,相信大家对Spring事务传播行为有了更加深入的理解,希望大家有所帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。