我正在运行一个多线程应用程序,并且在不同线程尝试访问特定表中的相同记录时遇到了问题。

线程A
-想要表“ LastOperations”中的最后一条记录,因此按ID desc LIMIT 1执行“选择更新”顺序。
-根据LastOpertaions表中的最后一条记录创建一个新记录,并将其插入其中。

螺纹B
-想要表“ LastOperations”中的最后一条记录,因此执行与线程A相同的活动。

两个线程都是相同的代码。只是处理不同的数据。此表上一次的最大活动线程为4-6。

问题
如果线程A锁定了ID为1000的最后一条记录,则线程B正在获取999条记录并将新条目添加到表中。 ID字段是自动递增1,它也是主键。

假设线程1正在购买原材料A,线程b正在购买原材料B。两者都应通过获取最新分录从同一帐户中扣除。发生的事情是一个线程从“帐户”中获取较旧的条目,从而导致帐户余额出现错误。

关于我所缺少的任何建议吗?数据库方面需要进行任何更改吗?

最佳答案

我相信您遇到的问题是Transaction Isolation Level。线程A尚未完成创建其记录的操作。因此,当线程B从“ LastOperations”获得的最新记录为999时,999确实是表中的最后一条记录。

您可以将事务隔离级别更改为READ UNCOMMITTED(如果您可以控制MySQL实例),但这很冒险。如果允许脏读,则线程A生成的完整记录可能不会在数据库中完成。 (因此,“脏读”中的“脏”。)

07-24 14:53