事务属性应用于外部调用,而不是由bean方法(例如您的案例)进行的内部调用。如果要将事务边界应用于调用,则应注入如下所示的bean实例。但是我认为这不是一个好习惯,我不建议这样做。正确的方法是定义另一个spring
bean,并将其与您以前的bean关联,然后将测试方法放入该新bean。
@Service("yourBean")@Transactionalpublic 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")); }}


