我想进行金融交易,但我对 MySQL 的交易功能不是很熟悉。
我想确定我做的所有事情都是正确的。我的目标是在我的交易期间“锁定”我的 transactionHistory 和 transactionQueued 表,以确保账户余额正确,并且不能插入其他交易/同时操纵余额。
SET autocommit=0;
START TRANSACTION;
IF (
SELECT SUM(amount) of transactionHistory WHERE account = 1
+
SELECT SUM(amount) of transactionsQueued WHERE account = 1)
>= :amount)
INSERT INTO transactionHistory (account, amount) VALUES (1, -:amount);
INSERT INTO transactionHistory (account, amount) VALUES (2, :amount);
COMMIT;
mySQL 锁定所有受影响的表是否正确?在本例中为 transactionHistory 和 transactionsQueued。
我正在使用 innoDB,此代码不是过程的一部分。
谢谢!
最佳答案
SET autocommit=0;
START TRANSACTION;
两者基本上做同样的事情,除了 START TRANSACTION 还释放 session 持有的所有锁。
如果您想锁定 TABLE(S) 中的记录,那么您可以使用 SELECT...FOR UPDATE 语句(这将锁定属于该 SELECT 中写入的条件的所有记录)。您需要在交易中使用它。
或者您可以锁定整个表。要锁定表,不能使用START TRANSACTION;然而。您需要像这样开始交易:
SET autocommit=0;
LOCK TABLES transactionHistory as t1 WRITE, transactionsQueued as t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
关于mysql - mySQL 事务是否所有受影响的表 "locked"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981709/