0

金融取引をしたいのですが、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 を使用していますが、このコードは手順の一部ではありません。

ありがとうございました!

4

2 に答える 2

1

INNODB を使用していることを理解してください。答えはノーです。ロック レベルは(MYISAM とは異なり)ROWではありません。TABLE

このリンクを参照してください: http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html


あなたはすでにそれを知っていると思いますが、あなたのコードは疑似コードであり、このようには機能しません。IF ステートメントは非常に手続き的であり、BEGIN END ブロックに含める必要があります。そうしないと、同等の高度なinsert selectステートメントを作成できます。

于 2013-04-12T22:25:11.033 に答える