gpt4 book ai didi

MySQL 事务 : multiple concurrent transactions and data integrity

转载 作者:可可西里 更新时间:2023-11-01 07:36:08 26 4
gpt4 key购买 nike

我在一个相当复杂的 Web 应用程序中使用事务管理跨多个 MySQL InnoDB 表的数据。简而言之,给定交易的工作方式如下:

  1. 从“user_point_totals”表中的一行读取数据
  2. 各种阴谋计算用户的新总分应该是多少
  3. 在“user_point_totals”表中创建一个新条目以反射(reflect)更新后的总数

假设用户 A 执行了一些与点数相关的操作,第 1 步被执行,执行线程将用户的点数总计读入内存,然后应用程序开始计算新的总计点数。同时,用户 B 执行了一个对用户 A 的总积分有影响的 Action ,另一笔交易开始了;但是,第一个事务尚未完成,因此第二个线程获得与第一个事务相同的点总值作为起点(来自同一表行)。随后,事务 1 完成并创建一个新的用户总点数以及它对新值应该是什么的感知,此后不久,事务 2 完成并为用户的总点数创建一个新行。但是,第二笔交易的总点数现在不正确,因为它没有考虑到交易 1 创建的新总点数。

我的问题是:

  • 由于交易的原子性质,这种情况是不可能的吗?我显然没有充分理解这一点?
  • 如果不是,如何确保在这些情况下存在数据完整性?

感谢您的考虑!

最佳答案

在技术层面上,您可以使用 table-locking (或行锁定)MySQL 的能力。这将使您能够检测是否有人真的在使用该表进行计算。另一方面,这种技术需要考虑很多因素,比如进程崩溃时会发生什么等等。

不过,在实际层面上,我怀疑您是否愿意做这样的事情。MySQL 中的 sum() 或 avg() 等运算符已针对此需求进行了优化。如果您需要做的是对表的某些列求和并在表中得到答案,您可以使用 View 或创建一个临时表(可能但速度较慢)。您不应该有一个包含可以从其他列计算的值的列。这种情况会导致不协调,因为如果关系不平衡,则不清楚哪个字段为真。 (是输入脚本错误还是某些程序员故意重复使用该字段?)

第二点,请务必在您的 MySQL 实例上使用 InnoDB 表,否则您的系统将无法完全兼容 ACID,这意味着您将无法获得所需的原子性。

关于MySQL 事务 : multiple concurrent transactions and data integrity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3769962/

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