1

テーブルの行をロックして、その行に対する他の読み取り操作がロックが解除されるまで待機するようにしたいのですが、テーブル全体がロックされるのを避けたいと考えています。

次のテーブルがあります(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=0transaction-isolation = SERIALIZABLE のみ構成する方法はありますか?

私は設定できることを知っています

[mysqld]
transaction-isolation = SERIALIZABLE
autocommit = 0

my.cnf、しかし、他のテーブルやスキーマで行われる他の操作には影響を与えたくありません。

参照:

4

1 に答える 1

0

autocommit と transaction-isolation の設定は、テーブルではなく、MySQL への各接続に関連付けられています。

ほとんどの言語バインディングには、自動コミットを有効または無効にする直接呼び出し可能な関数があります。たとえば、http://php.net/manual/en/mysqli.autocommit.php

これまでの方法でトランザクション分離レベルを設定できます。接続のためにそれを設定すると、設定されたままになります。たとえば、これを参照してください。mySQL - PHP の mysqli を使用して分離レベルを設定する

通常、このようなモード設定コードは、接続を確立するコードの直後に配置することをお勧めします。これにより、アプリケーションの残りの部分でモードが予測可能になります。

于 2015-02-24T13:49:43.673 に答える