多个@Transactional注释超过2种方法不起作用

时间:2014-08-18 11:35:16

标签: spring jpa transactions

我的交易有两种方法,如下面的

Class MyTransaction(){

@Transactional
public void initialTranx(){

  String userId = 500;
  // do some user specific activity
 updateUserBalance(500);
  // check user balance
}

@Transactional
private void updateUserBalance(int userId){
 // codes for updating balance to 400
}

}

现在调用initialTranx()方法,此方法在内部调用私有方法updateUserBalance(userid),但在执行updateUserBalance方法后,balance不会更新。仅在完成提交公共方法(父方法)事务之后。

我需要在完成私有方法之后提交我的第二个方法的事务。

我正在使用mysql for DB和spring data JPA。

请有人指导我。

3 个答案:

答案 0 :(得分:5)

  1. @Transactional不适用于私有方法,请使用public。根据类代理策略,在同一个类中调用方法也可能不会触发事务。

  2. JPA不正式支持嵌套事务。它可能work with Spring to some extent,但可能会发生奇怪的错误。

  3. 如果要在提交事务之前强制更改数据库,可以使用EntityManager.flush()

答案 1 :(得分:0)

使用em.flush()不是一个好习惯。我建议你使用传播功能。见link

public class ServiceClass {

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateUserBalance(int userId){
        // codes for updating balance to 400
    }

}

答案 2 :(得分:0)

这种方法不适用于同一个类中的两个方法,因为当initialTranx调用updateUserBalance时,它会在目标对象而不是代理对象上调用此方法。如果您将updateUserBalance移动到一个单独的类,那么它将使用 @Transactional(propagation = Propagation.REQUIRES_NEW)