春季交易只是在进入服务方式吗?

时间:2015-06-20 16:06:26

标签: mysql spring transactions spring-transactions

我已经阅读了很多关于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。

2 个答案:

答案 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();
 }
} 

此外,正如他们解释您已经无法在同一服务内启动事务。因此,如果您想要进行第一个方法事务处理,则必须从服务外部调用。