mysql - mySQL 事务是否所有受影响的表 "locked"?

标签 mysql transactions

我想进行金融交易,但我对 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/

相关文章:

php - 难道 PHP 中的 OOD 双重存储 MySQL 中的内容是一种资源浪费吗?

mysql - 如何在mysql查询中为每个类别选择一条记录?

MySQL View,从存储过程获取结果

ruby-on-rails - 如果其中一个数据库更新失败,rails db 事务不会回滚

python - 同时修改ZODB中的不同键

mysql - 如何在内连接中插入数据库记录

mysql - 同一列中多个值的连接语句,以逗号分隔

tsql - 何时在SQL Server中使用事务

java - Spring 4 + JPA (Hibernate 4) + JTA 事务管理器不会自动刷新

PHP 插入 - 首次输入的 UID 较大