我正在运行一个多线程应用程序,并且遇到问题,而不同的线程尝试访问特定表中的相同记录。
主题A - 想要表“LastOperations”中的最后一条记录,因此按ID desc LIMIT 1执行Select For Update订单。 - 根据LastOpertaions表中的最后一条记录创建一条新记录并插回其中。
主题B - 想要表“LastOperations”中的最后一条记录,因此与Thread A进行相同的活动。
两个线程都是相同的代码。只是使用不同的数据。一次最大活动线程数为4-6。
问题 如果线程A锁定了最后一个记录,例如id为1000,则线程B将获取999记录并将新条目添加到表中。 ID字段是自动增量1,也是主键。
假设线程1正在购买原材料A而线程b正在购买原材料B.两者都应该通过采用最新的条目从同一账户中扣除。发生的事情是一个线程从账户中获取较旧的条目,导致账户余额出错。
有关我缺少什么的任何建议? DB端需要进行哪些更改?
答案 0 :(得分:0)
我相信您遇到的问题是Transaction Isolation Level。线程A没有完成创建其记录。因此,当线程B从" LastOperations"中获取最新记录时作为999,999真的是表中的最后一个记录。
您可以将事务隔离级别更改为READ UNCOMMITTED(如果您可以控制MySQL实例),但这样做有风险。如果允许脏读,则线程A生成的完整记录可能无法在数据库中完成。 (因此,肮脏的阅读'脏读#39)。
答案 1 :(得分:0)
不要混合历史和当前。有两张桌子:
=MID(A1,FIND("""name""",A1)+8,FIND("""id""",A1)-FIND("""name""",A1)-10)
列出了所有操作;它主要是History
进入。INSERTed
列出了当前的余额。它主要是Current
。当要采取行动时:
UPDATEd