我的交易有两种方法,如下面的
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。
请有人指导我。
答案 0 :(得分:5)
@Transactional
不适用于私有方法,请使用public。根据类代理策略,在同一个类中调用方法也可能不会触发事务。
JPA不正式支持嵌套事务。它可能work with Spring to some extent,但可能会发生奇怪的错误。
如果要在提交事务之前强制更改数据库,可以使用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)