了解Spring事务边界
我正在尝试通过以下示例来消除我对Spring Transaction边界的怀疑。
@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"));
}
我想将test2()方法与test1()隔离开,即每次调用test()时,test2()都不应读取test1()提交的数据。请建议是否可以使用传播或隔离属性来处理这种情况。
提前致谢。
回答:
事务属性应用于外部调用,而不是由bean方法(例如您的案例)进行的内部调用。如果要将事务边界应用于调用,则应注入如下所示的bean实例。但是我认为这不是一个好习惯,我不建议这样做。正确的方法是定义另一个spring
bean,并将其与您以前的bean关联,然后将测试方法放入该新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"));
}
}
解决这个特殊问题的替代的更好的方法;
@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事务边界 的全部内容, 来源链接: utcz.com/qa/412792.html