【问题标题】:Do I really need a database transaction?我真的需要数据库事务吗?
【发布时间】:2017-12-30 13:55:38
【问题描述】:

如果我的方法有多个只读且仅更新、删除语句,那么创建事务是否有意义?虽然,从表面上看,它没有任何意义(如果它是单线程的);但这是一个并发 Web 应用程序,其中多个线程可以同时修改数据。

【问题讨论】:

  • 系统中是否有任何其他方法可能在此过程中写入数据库?可以看到部分更新的数据吗?
  • 如果您重视数据的一致性,那么 YES。如果您不在乎您的数据是否已损坏,或者您的数据库一次只能由一个用户访问,那么不需要。
  • 我稍微修改了这个问题。这是并发网络应用程序。但没有具体的交易要求。

标签: java database transactions spring-data-jpa


【解决方案1】:

是的,可能有充分的理由将您的读取 (SELECT) 操作包含在显式事务或工作单元中。如果更新或删除某些行的决定取决于您读取的行(同一行或另一个表中的行)的列值,甚至某些行的存在,那么您可能需要将 SELECT 作为一部分交易。

一个简单的例子:表 A 包含书籍,并且有一个用于评级的 int 列。如果书的评级为零 (0),我想删除它。如果没有事务,数据层中的代码会选择评级为 0 的行,然后您会遍历该书行集合。在您选择了行之后的某个时间,另一位用户将其中一本书的评级更改为一 (1)。您最终仍然删除了该书行,而它不应该这样做。

自从您获取数据(时间戳等)以来,存在数据一致性和检查更新的策略,但您只需要在读取数据并根据该数据做出决策时评估数据完整性风险,并且您允许其他用户更新相同的数据。

交易旨在消除这种风险。

【讨论】:

    【解决方案2】:

    如果您在方法中有多个数据库操作(INSERT、UPDATE、DELETE),则需要使用横切

    【讨论】:

      【解决方案3】:

      如果此方法执行例如 2 次读取,并且还有另一种方法正在更新您的数据库。它可能会发生,发生一次读取,然后您的另一个(事务性)方法同时运行,并且只有在那之后您的第二次读取才会执行。这可能会导致读取结果无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-13
        • 2012-03-26
        • 2014-12-07
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2020-01-29
        相关资源
        最近更新 更多