mysql中如何实现原子事务?

tet*_*241 6 mysql atomic

我正在开发我的演示项目 - 它是一个简单的银行。

我有一个问题。

我需要向我的帐户添加一些虚拟货币。

但我需要“像原子操作一样”做到这一点,我需要在更新之前查询一些数据。

喜欢:

Query table A // select from table A
Query table B // select from table B
if (A + B > X) 
Add money // insert into table C
Run Code Online (Sandbox Code Playgroud)

问题是,在查询 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
Run Code Online (Sandbox Code Playgroud)

可悲的例子

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
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 2

仅凭交易并不能满足您的需要。MySQL 中的纯读查询不会阻止其他会话更新行。

阅读有关 MySQL 中的锁定读取的信息:https ://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

为了防止您提到的竞争条件,您需要在单个原子操作中获取 A 和 B 上的锁。JOIN您可以通过使用或对两个资源进行锁定读取来完成此操作UNION

您还可以锁定整个表,并以原子方式锁定多个表。请参阅https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html