在Springboot中,我称之为服务的每个服务都会打开一个事务,并在服务返回时关闭该连接,但就我而言,我需要创建一个将同步运行的方法(该方法仅在非同步方法中运行),如果是否有一个未打开的事务,他需要独立地打开和关闭事务,并且该方法中的每个SQL操作仅在THAT方法引发错误时才会回滚。如果调用它的方法抛出错误,他将不会回滚同步方法所做的任何事情。
所以我尝试使用此示例:
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
public void methodNotSyncronized(String arg1, String arg2){
logger.debug("init method no syncronied");
MyObjct myObj = myRepository.findOne(1);
methodSyncronized(arg2);
myRepository.save(myObj); //If I got some error here everything that methodSyncronized did should remaining
logger.debug("finish method no syncronied");
}
@Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRES_NEW)
private synchronized String methodSyncronized(String arg){
logger.debug("init method syncronied");
//Here I will insert or delete something
}
}
但是当我调试此代码时,我得到了:
o.h.e.t.internal.TransactionImpl : begin
myService : init method no syncronied
myService : init method syncronied
myService : finish method no syncronied
o.h.e.t.internal.TransactionImpl : committing
我该如何解决
还有另一件事,即使我只将休眠打印的一个数字相加,我调用的每个服务也是如此:
o.h.e.t.internal.TransactionImpl : begin
o.h.e.t.internal.TransactionImpl : committing
即使我将 @Transactional(readOnly = true)放入方法
答案 0 :(得分:5)
它不起作用是因为Spring @Transaction method call by the method within the same class, does not work
:这是Spring AOP(动态对象和cglib)的局限性。
检查以下内容:Spring @Transaction method