是否所有受影响的表格;“锁定”;通过mySQL事务?

是否所有受影响的表格;“锁定”;通过mySQL事务?,mysql,transactions,Mysql,Transactions,我想做一个金融交易,但我不太熟悉MySQL的交易功能 我想确定我做的一切都是对的。我的目标是在我的交易期间“锁定”我的transactionHistory和transactionQueued表,以确保帐户余额正确,并且不能插入其他交易/同时操纵余额 SET autocommit=0; START TRANSACTION; IF ( SELECT SUM(amount) of transactionHistory WHERE account = 1 + SELECT SUM(amount) of

我想做一个金融交易,但我不太熟悉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和TransactionQueued

我正在使用innoDB,此代码不是过程的一部分


谢谢大家!

了解到您正在使用INNODB,答案是否定的,锁定级别是
,而不是
(与MYISAM不同)

请参阅此链接:



我想您已经知道了,但是您的代码是伪代码,不会像这样工作。IF语句非常程序化,需要包含在BEGIN-END块中,或者您可以构建一个等效的高级
insert-select
语句。

了解您使用的是INNODB,答案是否,锁级别是
,而不是
(与MYISAM不同)

SET autocommit=0;
START TRANSACTION;
请参阅此链接:


我想您已经知道了,但是您的代码是伪代码,不会像这样工作。IF语句非常程序化,需要包含在BEGIN-END块中,或者您可以构建一个等效的高级
insert-select
语句

SET autocommit=0;
START TRANSACTION;
两者的作用基本相同,除了启动事务还实现会话持有的所有锁

如果要锁定表中的记录,则可以使用SELECT…FOR UPDATE语句(这将锁定属于该SELECT中写入的条件的所有记录)。您需要在事务中使用它

或者你可以锁上整张桌子。要锁定表,不能使用启动事务;然而。您需要像这样启动事务:

SET autocommit=0;
LOCK TABLES transactionHistory as t1 WRITE, transactionsQueued  as t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;
两者的作用基本相同,除了启动事务还实现会话持有的所有锁

如果要锁定表中的记录,则可以使用SELECT…FOR UPDATE语句(这将锁定属于该SELECT中写入的条件的所有记录)。您需要在事务中使用它

或者你可以锁上整张桌子。要锁定表,不能使用启动事务;然而。您需要像这样启动事务:

SET autocommit=0;
LOCK TABLES transactionHistory as t1 WRITE, transactionsQueued  as t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

您的代码“原样”似乎不正确,它是否属于存储过程?此外,您还必须告诉我们用于相关表的数据库引擎是什么(myisam/innodb/…?)。另外,2、
START TRANSACTION
是隐式的。(确保使用自动提交=0)好的thx。我正在使用innodb,此代码不是过程的一部分。我还没有测试它。您的代码“原样”似乎不正确,它属于存储过程吗?此外,您还必须告诉我们用于相关表的数据库引擎是什么(myisam/innodb/…?)。另外,2、
START TRANSACTION
是隐式的。(确保使用自动提交=0)好的thx。我正在使用innodb,此代码不是过程的一部分。我还没有测试它。是的,我正在使用innodb,它是pseuocode。哦,那么我该怎么做才能让它按预期工作/防止所提到的表中的更改呢。可以将锁级别更改为整个表吗?可以,但为什么要这样做?您希望锁保持多久?好的,以这个php代码段为例,如果(user->getBalance()>=$sendAmount){sendAmount(userID,receiverID,$sendAmount);}我的sendAmount函数应该执行我在问题中编写的查询。如果我不锁定该表,则在快速连续执行该事务时,该事务可能会执行两次。还是我错了?锁定不会阻止事务执行两次,它只会延迟第二次。好的,但当我检查查询中的余额,并且只有在用户有足够资金时才继续插入时,它现在就可以正常工作了,对吗?是的,我使用的是innodb,它是伪代码。哦,那么我该怎么做才能让它按预期工作/防止所提到的表中的更改呢。可以将锁级别更改为整个表吗?可以,但为什么要这样做?您希望锁保持多久?好的,以这个php代码段为例,如果(user->getBalance()>=$sendAmount){sendAmount(userID,receiverID,$sendAmount);}我的sendAmount函数应该执行我在问题中编写的查询。如果我不锁定该表,则在快速连续执行该事务时,该事务可能会执行两次。还是我错了?锁定不会阻止事务执行两次,它只会延迟第二次。好吧,但当我检查查询中的余额,并且只有在用户有足够资金时才继续插入时,它现在就可以正常工作了,对吗?