MySQL选择更新并插入

时间:2017-09-16 11:13:30

标签: java mysql multithreading select insert-update

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

主题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端需要进行哪些更改?

2 个答案:

答案 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
相关问题