gpt4 book ai didi

java - transactions/spring Transaction propagation 会解决这个并发问题吗?

转载 作者:行者123 更新时间:2023-11-30 07:26:35 25 4
gpt4 key购买 nike

如果可以的话,我有几个关于 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 会创建一个新事务,即使当前正在执行一个事务,但我仍然看不出这将如何解决我的问题.

预先感谢您的帮助。

最佳答案

需要考虑的事情很少,DAO是专注于单个实体的操作,而服务是专注于一个或多个实体的操作,所以事务应该放在服务层,这样你就可以在没有任何事务的情况下重用DAO的操作,但是让决定何时开始和结束交易的服务

  1. 它不是在单个事务中,而是两个单独的事务。
  2. 这是您当前设计的并发问题,请参阅以下建议。

界面

public interface MyClass {
public void publishRecords(List<Long> ids);
}

实现

@Service
@Transactional(readOnly = false)
class DefaultMyClass implements MyClass {

@Autowired
MyDAO dao;

// single transaction
@Override
public void publishRecords(List<Long> ids) {
for(Long id : ids){
if(!dao.isBeingPublished(id)){
dao.setBeingPublished(id);
//do something to publish the record
}
}
}
}

DAO

class MyDAO {

public bloolean isBeingPublished(Long recordID){
// bigbang
}

public boolean setBeingPublished(Long recordID){
// bigbang
}
}

使用上述设计,这两个问题都得到了解决。

关于java - transactions/spring Transaction propagation 会解决这个并发问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10248347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com