Spring事务传播属性

论坛 期权论坛     
选择匿名的用户   2021-6-2 16:04   1112   0
<h2>/**<br> *   事务传播 - Propagation</h2>
<h2>*<br> *   REQUIRED: 使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中,如果当前存在事务,则加入这个事务,成为一个整体<br> *  <br> *   SUPPORTS: 如果当前有事务,则使用事务;如果当前没有事务则不使用事务<br> *   MANDATORY: 该传播属性强制必须存在一个事务,如果不存在则抛出异常<br> *   REQUIRES_NEW: 如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用,如果当前没有事务,则同 REQUIRED<br> *   NOT_SUPPORTED: 如果当前有事务,则把事务挂起,自己不使用事务去运行数据库操作,如果当前没事务,则不使用事务<br> *   NEVER:  如果当前有事务存在,则抛出异常<br> *   NESTED: 如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;如果当前没有事务,则同REQUIRED。但是如果主事务提交,则会携带子事务一起提交。如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务(给子方法添加try、catch)可以回滚或者不会滚<br> */</h2>
<h3><span style="color:#f33b45;">没添加事务例子:</span></h3>
<p><span style="color:#f33b45;">UserServiceImpl.java</span></p>
<pre class="blockcode"><code>   &#64;Override
    public void saveParent() {
        User user &#61; new User();
        user.setUserName(&#34;parent&#34;);
        userMapper.persist(user);  // 插入数据库
    }

    &#64;Override
    public void saveChildren() {

  
        saveChild1();
        int a &#61; 1 / 0;  // 手动制造/0异常
        saveChild2();  




    }

    &#64;Override
    public void saveChild1() {
        User user &#61; new User();
        user.setUserName(&#34;child-1&#34;);
        userMapper.persist(user);  // 插入数据库
    }

    &#64;Override
    public void saveChild2() {
        User user &#61; new User();
        user.setUserName(&#34;child-2&#34;);
        userMapper.persist(user);  // 插入数据库
    }</code></pre>
<p><span style="color:#f33b45;">TestTransServiceImpl.java</span></p>
<pre class="blockcode"><code>
    &#64;Override
    public void testPropagationTrans() {
        userService.saveParent();
        userService.saveChildren();
    }</code></pre>
<p>测试类:</p>
<pre class="blockcode"><code>&#64;RunWith(SpringRunner.class)
&#64;SpringBootTest(classes &#61; ChargeApplication.class)
public class TransTest {
    &#64;Autowired
    private UserService userService;

    &#64;Autowired
    private TestTransService testTransService;

    &#64;Test
    public void myTest(){
        testTransService.testPropagationTrans();
    }
}
</code></pre>
<p>运行测试方法myTest,数据库只会插入<span style="color:#f33b45;">saveParent()方法</span>和<span style="color:#f33b45;">saveChild1()方法</span>的数据。很好理解,在运行saveChild2()方法之前已经发生了除0异常,并且没有捕获,所以saveChild2()方法不会继续执行。</p>
<p><img alt="" height="104" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-ad00f8d7a7a4db5c56bf44f7ad3632d5.png" width="541"></p>
<p> </p>
<h3><span style="color:#f33b45;">REQUIRED例子:</span></h3>
<p>①.给TestTransServiceImpl.java的方法添加事务</p>
<pre class="blockcode"><code>    &#64;Transactional(propagation &#61; Propagation.REQUIRED)
    &#64;Override
    public void testPropagationTrans() {
        userService.saveParent();
        userService.saveChildren();
    }</code></pre>
<div>
  
</div>
<p>运行测试方法myTest,数据不会插入数据</p>
<p><img alt="" height="105" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-c52c870d30f615caa31621d4af143be1.png" width="409"></p>
<p><strong><span style="color:#f33b45;">解释:由于在方法上添加REQUIRED,它下的字方法(saveParent、saveChildren)都会在同一个父方法事务里,其中某个方法出现了异常,该事务会被回滚,所以无法插入数据</span></strong></p>
<p> </p>
<h3><span style="color:#f33b45;">3)SUPPORTS</span></h3>
<p>①.只给 UserServiceImpl.java 的方法添加SUPPORTS</p>
<pre class="blockcode"><code>    &#64;Transactional(propagation &#61; Propagation.SUPPORTS)
    &#64;Override
    public void saveChildren() {
        saveChild1();
        int a &#61; 1 / 0;
        saveChild2();
    }</code></pre>
<p>TestTransServiceImpl.java</p>
<pre class="blockcode"><code>    &#64;Override
    public void testPropagationTrans() {
        userService.saveParent();
        userService.saveChildren();
    }</code></pre>
<p>运行测试类,效果:</p>
<p><img alt="" height="153" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-f4b87ee9ffd127c74f7f7eae116b0f63.png" width="461"></p>
<p><span style="color:#f33b45;"><strong>解释:由于testPropagationTrans()没有父方法没有事务,则添加SUPPORTS也没事务,所以效果和例子1不添加事务一样</strong></span></p>
<p>②. 给 UserServiceImpl.java 的方法添加SUPPORTS</p>
<pre class=
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP