テーブルの行をロックして、その行に対する他の読み取り操作がロックが解除されるまで待機するようにしたいのですが、テーブル全体がロックされるのを避けたいと考えています。
次のテーブルがあります(InnoDB)
CREATE TABLE account_balance (
account INTEGER UNIQUE,
balance INTEGER NOT NULL,
PRIMARY KEY (account)
);
次のトランザクションを実行して、行のロックを取得します
START TRANSACTION;
SELECT balance FROM account_balance WHERE account = 1 FOR UPDATE;
SELECT SLEEP(10);
COMMIT;
そして、次のクエリでロックが解放されるのを待ちたいと思います
SELECT balance FROM account_balance WHERE account = 1;
それを行うには、私が見つけた唯一の方法は、次のようにSELECTを実行することです
SET autocommit = 0; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT ....;
ロックが解放されるのを待ちSELECT
ますが、このテーブルの autocommit と分離レベルの設定を前に付ける必要があります。
テーブルレベルautocommit=0
でtransaction-isolation = SERIALIZABLE
のみ構成する方法はありますか?
私は設定できることを知っています
[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0
でmy.cnf
、しかし、他のテーブルやスキーマで行われる他の操作には影響を与えたくありません。
参照: