transactions/spring 事务传播会解决这个并发问题吗?

2023-12-22

如果可以的话,我有几个关于 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) and 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
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

transactions/spring 事务传播会解决这个并发问题吗? 的相关文章

  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 为什么通过 方法向 List 添加元素(类型正确)会出现编译错误? [复制]

    这个问题在这里已经有答案了 我对泛型通配符概念几乎没有疑问 1 假设我有一个方法 void write List
  • 如何将本机数据库运算符 (postgres ~) 与 JPA 标准生成器一起使用?

    我使用 JPA 2 0 标准构建以下查询 简化 select n from notif n where n message b la 我正在使用 postgresql 数据库 我真的需要 运算符 而不是像 我可以使用与 CriteriaBu
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 使用 Swagger 的 Spring REST API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以帮助我生成 RESTful API 文档的工具 我的服务器是用Java编写的并使用S
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset

随机推荐

  • 如何处理加载 iframe 时出现的错误?

    我有一个其他网站可以包含这些内容 以便他们的用户可以POST返回我的网站的表格 我想优雅地处理我的网站关闭或我的服务器无法提供服务的情况内容 即响应超时或 4xx 或 5xx 错误 我尝试添加一个onError to the 对象 但这似乎
  • 如何放弃 LuaJ 协程 LuaThread?

    我正在尝试一种游戏机制 玩家可以在游戏计算机上运行脚本 脚本执行在游戏级别上将受到资源限制 每次更新只能执行一定数量的指令 以下概念验证演示了基本级别的沙箱和任意用户代码的限制 它成功运行了约 250 条精心设计的 用户输入 指令 然后丢弃
  • 清除网站数据相当于 Javascript 吗?

    我希望在 Javascript 函数中具有与 清除站点数据 相同的行为 因为我的 Angular 应用程序 升级 Angular 后 似乎在不清除站点数据的情况下行为不当 而且我不希望客户被迫自己清除站点数据 如果不可能清理所有内容 是否至
  • PHP MySQL 选择随机行

    我在随机选择 6 个朋友时遇到问题 这是我到目前为止收到的查询 result num rows SELECT FROM friends WHERE member id SESSION userid if result gt 6 f num
  • 远程服务器返回错误 (403) 禁止

    我在下载文件时遇到问题 链接如下 http vsbg023 cda pl apple 13801451161599 mp4 st zFHkNA18rmxan4AvOQWRmw e 1431286721 这只是一个例子 一旦 WebClien
  • 无效的匿名类型成员声明符

    我对以下代码有问题 根据这个 MSDN 论坛帖子 https social msdn microsoft com Forums en US 3b13432a 861e 45f0 8c25 4d54622fbfb4 linq group an
  • angular-cli 新项目中的 webpack.config.js 在哪里?

    我正在研究 webpack 和 Angular cli 尽管 Angular cli 应该使用 webpack 但我看不到任何webpack config js当我使用以下命令创建新项目时的文件ng new 有谁知道这在 Angular C
  • ggplot2 中有没有内置的方法可以进行对数色标?

    以下是分箱密度图的示例 library ggplot2 n lt 1e5 df lt data frame x rexp n y rexp n p lt ggplot df aes x x y y stat binhex print p 调
  • 如何在 ASP.NET MVC 4 中忽略特定视图文件夹或特定 cshtml 文件的路由

    我想在浏览 Views 文件夹中的特定页面时忽略路由 但我尝试使用以下方法未成功 routes RouteExistingFiles false routes IgnoreRoute Views NoMove specificPage cs
  • 您能详细介绍一下 VS 2010 中的具体属性吗?

    我知道您可以进入每个属性 也可以不进入每个属性 但我真的很希望能够进入特定的属性 而不是其余的 这可能吗 我也知道我可以使用键盘命令 但我问是否有更永久的解决方案 我有很多属性 并且我的 setter 做了重要的事情 所以跳过它们是愚蠢的
  • 何时使用递归互斥体?

    我了解递归互斥体允许互斥体被锁定多次而不会陷入死锁 并且应该解锁相同的次数 但在什么特定情况下需要使用递归互斥锁呢 我正在寻找设计 代码级别的情况 例如 当您有递归调用它的函数 并且您希望同步访问它时 void foo mutex acqu
  • EnumProcessModules 在 32 位 win7 上失败并出现错误 299

    我的代码在win7 32位上运行 但是当我使用EnumProcessModules 它返回 false 并且 getlasterror 返回错误代码 299 这声明该程序是 32 位的 该语句不能在 64 位系统上运行 我想知道为什么会发生
  • 新标签页中的 javascript window.location

    我通过以下方式将用户转移到某个网址window location但此网址会在浏览器的同一选项卡中打开 我希望它在新选项卡中打开 我可以使用 window location 这样做吗 还有其他方法可以执行此操作吗 window open ht
  • guava:将列表转换为以索引为键的映射

    在我的应用程序中 我有一个列表名称 我希望根据索引值将其转换为地图 例如 List
  • android:从模拟器中删除多点触摸

    今天我做了以下一组更新 将我的 Android Studio 从 2 0 预览版 4 更新为2 0 preview 5 将我的 Android SDK 工具更新为25 0 2 rc3 将我的 Android 6 0 Google API I
  • Knockout.Js 无法检测以编程方式更改的复选框状态

    我有一个简单的复选框 其值通过我正在编写的一些基础设施进行调整 以便在 localStorage 中保留状态 我知道这通常是通过设置 viewModel 来完成的 但是基础设施不知道任何淘汰绑定 也无法访问它们 我不认为这会是一个问题 因为
  • 如何将一个宝石的资产包含在另一个宝石中?

    我正在构建一个 gem Rails 引擎 让我们称之为它my new gem 以及里面my new gem我正在尝试包含来自另一个 gem 的 JavaScript 资产 让我们称之为它the other gem In the gemspe
  • 致命异常:java.lang.NoSuchMethodError:没有静态方法 isDeviceProtectedStorage

    使用时科尔多瓦插件 firebase https github com arnesson cordova plugin firebase 我遇到了以下错误 04 27 16 59 35 745 6859 6859 E AndroidRunt
  • Delphi无法加载包找不到指定的模块

    德尔福10 3 Windows 10 我正在尝试安装 Advantage 数据库的 TDataSet 组件 我已经将它安装到我的笔记本电脑上 没有任何问题 笔记本电脑具有相同的系统 在我的桌面上 我收到错误 无法加载包 找不到指定的模块 我
  • transactions/spring 事务传播会解决这个并发问题吗?

    如果可以的话 我有几个关于 Spring 事务的问题 假设我有这个 DAO 类 public class MyDAO verifies if a certain record in DB contains True in a certain