gpt4 book ai didi

java - 了解 Spring 事务边界

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:33:59 26 4
gpt4 key购买 nike

我正在努力消除我对 w.r.t. 的疑虑。 Spring 事务边界与以下示例。

@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 方法进行的内部调用。如果您希望事务边界应用于您的调用,您应该注入(inject)您的 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"));
}
}

关于java - 了解 Spring 事务边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5538262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com