【发布时间】:2012-05-02 03:56:18
【问题描述】:
如果可以的话,我有几个关于 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)和dao.setBeingPublished(id)是在同一个事务中执行还是在不同事务中执行?-
第二个问题是关于并发的,可以创建多个
MyClass实例并且可以并发调用publishRecord方法,所以两个并发调用!dao.isBeingPublished(id)可能都给出相同的结果,从而记录发布了两次! 我会考虑使publishRecords同步,但应用程序可能部署在多个服务器上,这使得同步声明无用,因此我对事务提出疑问,因为数据库是部署在这些服务器上的应用程序之间的唯一共享资源。
我的问题的解决方案究竟是什么?我阅读了 Spring 的事务传播,发现 REQUIRES_NEW 会创建一个新事务,即使当前正在执行一个事务,但我仍然看不出这将如何解决我的问题。
提前感谢您的帮助。
【问题讨论】:
标签: java spring concurrency transactions