我已经阅读了很多关于spring transaction的stackoverflow页面。 我的春季交易配置是
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
我的服务是这样的。
@Service
public class TestServiceImpl implements TestService {
@Override
public void testRollback() {
testRollbackSecondLevel();
}
@Transactional
@Override
public void testRollbackSecondLevel() {
// any update sql in here
carCostService.testUpdate();
throw new RuntimeException();
}
}
然后我编写了一个测试类来测试,在我的测试代码中,当我使用
时// this test is not roll back, and the Transactional even not created
@Test
public void testTransactional() {
// use this function, the Transactional don't work
interCityService.testRollback();
}
// this test is roll back successfully
@Test
public void testTransactionalSecondLevel() {
// but if I use the second level function instead of the first function,
// the Transactional works fine, and the data can roll back
interCityService.testRollbackSecondLevel();
}
我调试代码,当我使用第一个测试时,甚至不会创建事务。第二个可以成功创建事务。
我使用sql判断事务是否存在。
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
如果sql返回空集,则不会创建任何事务。
那么问题是什么?提前谢谢。
我使用的是弹簧版4.1.2.RELEASE。
答案 0 :(得分:1)
spring @Transactional使用代理工作,这意味着在同一个类中使用此注释调用方法没有任何影响== @Transactional将被忽略。有关于它的maaaaany主题,请在此处查看更深入的解释:Spring @Transaction method call by the method within the same class, does not work?
答案 1 :(得分:0)
如果您希望所有方法服务事务都将事务注释添加为类而不是方法级
@Transactional
@Service
public class TestServiceImpl implements TestService {
@Override
public void testRollback() {
testRollbackSecondLevel();
}
@Override
public void testRollbackSecondLevel() {
// any update sql in here
carCostService.testUpdate();
throw new RuntimeException();
}
}
此外,正如他们解释您已经无法在同一服务内启动事务。因此,如果您想要进行第一个方法事务处理,则必须从服务外部调用。