如果可以的话,我有几个关于 Spring 事务的问题。假设我有这个 DAO 类:
public class MyDAO {
/**
* verifies if a certain record in DB contains 'True' in a certain Column named publishFlag
*/
@Transactional
public bloolean isBeingPublished(Long recordID){
...
}
/**
* sets the record's publishFlag column to true indicating that it's being published
*/
@Transactional
public boolean setBeingPublished(Long recordID){
...
}
}
以及使用它的以下类:
public class MyClass {
@Autowired
MyDAO dao;
public void publishRecords(List<Long> ids){
for(Long id : ids){
if(!dao.isBeingPublished(id)){
dao.setBeingPublished(id);
//do something to publish the record
}
}
}
}
我的问题是:
首先,
!dao.isBeingPublished(id)
anddao.setBeingPublished(id)
会在同一个事务中执行还是在单独的事务中执行?第二个问题是关于并发的,
MyClass
可以创建多个实例并且可以并发调用该publishRecord
方法,因此两个并发调用!dao.isBeingPublished(id)
可能都给出相同的结果,从而使记录发布两次! 我会考虑进行publishRecords
同步,但应用程序可能部署在多个服务器上,这使得同步声明无用,因此我对事务的问题是,因为数据库是部署在这些服务器上的应用程序之间的唯一共享资源。
我的问题的解决方案到底是什么?我阅读了 spring 的事务传播并发现REQUIRES_NEW
即使当前正在执行一个事务也会创建一个新事务,但是我仍然看不出这将如何解决我的问题。
预先感谢您的帮助。