我在一个相当复杂的 Web 应用程序中使用事务来管理多个 MySQL InnoDB 表中的数据。简而言之,给定事务的工作方式如下:
- 从“user_point_totals”表中的一行读取数据
- 各种阴谋计算用户的新点总数应该是多少
- 在“user_point_totals”表中创建一个新条目,反映更新后的总数
假设用户 A 执行了一些与积分相关的操作,执行第 1 步,执行线程将用户的总积分读入内存,应用程序开始计算新的总积分。同时,用户 B 执行了一个对用户 A 的总积分有影响的动作,另一笔交易开始;但是,第一个事务还没有完成,所以第二个线程获得与第一个事务相同的点总值作为起点(来自同一表行)。随后,事务 1 完成并创建一个新的用户积分总数,它对新值应该是什么的感知,不久之后,事务 2 完成并为用户的积分总数创建一个新行。但是,第二笔交易的总积分现在不正确,
我的问题是:
- 由于交易的原子性质,这种情况是不可能的,我显然不明白我应该理解的程度吗?
- 如果不是,如何确保在这些情况下存在数据完整性?
感谢您的考虑!