了解Spring Transaction边界 [英] Understanding Spring Transaction boundaries

查看:105
本文介绍了了解Spring Transaction边界的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图清除我的疑虑w.r.t.使用以下示例的Spring事务边界。

I am trying to clear my doubts w.r.t. Spring Transaction boundaries with following example.

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void test() {    
    test1();
    test2();        
}

@Transactional(propagation=Propagation.NOT_SUPPORTED, readOnly=false)
public void test1() {
    this.jdbcTemplate.execute("INSERT INTO TEST VALUES('T', 'C2', 0, 1)");      
}

@Transactional(propagation=Propagation.SUPPORTS, isolation=Isolation.READ_UNCOMMITTED, readOnly=true)
public void test2() {
    System.out.println(this.jdbcTemplate.queryForInt("select count(*) from TEST"));         
}

我想从test1()中隔离test2()方法test()被称为test2()不应该读取test1()提交的数据。
请建议使用传播或隔离属性来处理这种情况。

I want to isolate test2() method from test1() that is each time test() is called test2() should not read the data committed by test1(). Please advice is it possible to handle this scenario using propagation or isolation attributes.

提前致谢。

推荐答案

事务属性应用于外部调用,而不是由bean方法(如您的案例)进行的内部调用。如果您希望将事务边界应用于您的调用,则应该注入您的bean实例,如下所示。但我认为这不是一个好习惯,我不建议..正确的方法是定义另一个spring bean并将它与之前的bean相关联,并将测试方法放到这个新bean中。

Transaction attributes are applied to external calls , not internal calls made by bean method such as your case. If you want transaction boundaries applied to your call, you should inject your bean instance such as below. But I think that it is not good practice, I would not recommend.. The right way to accomplish is to define another spring bean and associate it with your previous bean and put your test method to this new bean.

@Service("yourBean")
@Transactional
public class YourBeanClass implement IYourBean {

   @Resource(name="yourBean")
    IYourBean yourBean;

        @Transactional(propagation=Propagation.REQUIRED)
    public void test() {    
        yourBean.test1();
        yourBean.test2();       
    }

    @Transactional(propagation=Propagation.REQUIRED)
    public void test1() {
        this.jdbcTemplate.execute("INSERT INTO TEST VALUES('T', 'C2', 0, 1)");      
    }

    @Transactional(propagation=Propagation.NOT_SUPPORTED)
    public void test2() {
        System.out.println(this.jdbcTemplate.queryForInt("select count(*) from TEST"));         
    }

}

解决此特定问题的替代方法和更好方法;

Alternative and better way to solve this particular problem ;

 @Service("otherBean")
    @Transactional
    public class OtherBeanClass implement IOtherBean {

     @Autowired
     IYourBean yourBean;

      @Transactional(propagation=Propagation.REQUIRED)
        public void test() {    
            yourBean.test1();
            yourBean.test2();       
        }

   }



    @Service("yourBean")
    @Transactional
    public class YourBeanClass implement IYourBean {



        @Transactional(propagation=Propagation.REQUIRED)
        public void test1() {
            this.jdbcTemplate.execute("INSERT INTO TEST VALUES('T', 'C2', 0, 1)");      
        }

        @Transactional(propagation=Propagation.NOT_SUPPORTED)
        public void test2() {
            System.out.println(this.jdbcTemplate.queryForInt("select count(*) from TEST"));         
        }
}

这篇关于了解Spring Transaction边界的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆