【发布时间】:2022-01-12 17:55:09
【问题描述】:
我正在开发我的演示项目 - 它是一个简单的银行。
我有一个问题。
我需要在我的帐户中添加一些虚拟货币。
但是我需要“像原子操作一样”,我需要在更新之前查询一些数据。
喜欢:
Query table A // select from table A
Query table B // select from table B
if (A + B > X)
Add money // insert into table C
问题是,在查询 A 或 B 期间,另一个线程可以开始一些工作。
我应该使用哪种mysql技术?
示例: 快乐的例子
User see A = 1, B = 1 in dashboard
User will send request
SELECT A
SELECT B
INSERT A + B // result is 2
悲惨的例子
User see A = 1, B = 1 in dashboard
User will send request
SELECT A
// SOMEONE CHANGED B RIGHT NOW TO 10 !
SELECT B
INSERT A + B // result is 12
【问题讨论】:
-
你应该使用TRANSACTIONs
-
选择无关紧要,您将事务包装在 INSERTS 和 UPDATES 周围,以便它们全部成功运行,或者在错误回滚之前完成的那些,因此数据库看起来没有发生任何事情。您只是在更改表 C
-
但是有人可以“破坏”选择中的数据。比如,有人可以更改我的数据,例如“关键部分”。
-
您可以使用插入...选择...或锁定读取(选择...进行更新)。
-
这就是锁定读取的用途。