###前提・実現したいこと
mysql5.7のInnoDBテーブルをノンユニークなセカンダリインデックスカラムで、並列処理にて行を一括削除したいが、排他ネクストキーロックのおそらく前方へのギャップロックにより、WHERE句条件の対象外のレコードもロックされ、並列処理で異なるWHERE句条件を指定してもロック待ちとなってしまう(最終的には、削除後にinsertまで実行しデータを入れ替えしたい)
上記を、並列処理でロック待ちを発生させずに処理したい。
※テーブルイメージ:売上明細情報テーブル
シーケンスID INT、年月 INT(YYYYMM)、、、その他の売上明細単位のカラム、、、
⇒ IDではもちろんユニークだが、年月ではユニークにはならない。
それを、並列処理にて、年月カラム(セカンダリインデックスあり)で削除して、データを入れ替えたい。
###発生している問題・エラーメッセージ
Aプロセスが、トランザクションを開始
201709を削除(delete from 売上明細情報テーブル where 年月 = 201709)、OK
(この後insert用のデータ加工に時間がかかる)
Aプロセスのトランザクションの完了を待たずに、Bプロセスが、トランザクションを開始
201708を削除(delete from 売上明細情報テーブル where 年月 = 201708)、ここでロック待ち★
###試したこと
トランザクション分離レベルは mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation; +-----------------------+-----------------+ | @@GLOBAL.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec) これだと、リファレンスを見る限り難しそうだったので、、 トランザクション分離レベルを、"READ COMMITTED"に変更して打開策を探す。 デフォルトのautocommitを念のため、変更しておく mysql> set autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@autocommit; +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> delete from 売上明細情報テーブル where 年月 = 201709; Query OK, 8345 rows affected (2.18 sec) ここで、trx_rows_lockedを確認、16690(倍になる、、嫌な予感) mysql> use information_schema; Database changed mysql> SELECT trx_rows_locked FROM INNODB_TRX; +-----------------+ | trx_rows_locked | +-----------------+ | 16690 | +-----------------+ 1 row in set (0.00 sec) 以下、別窓から デフォルトのautocommitを念のため、変更しておく mysql> set autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@autocommit; +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> delete from 売上明細情報テーブル where 年月 = 201708; ロック待ち★ 疑問点:トランザクション分離レベルを"READ COMMITED"に変更することで ギャップロックが無効化されるのを期待し、つまり排他ネクストキーロック のインデックスレコードに対するレコードロックのみが適用されることを 意図した(その場合、異なるWHERE句条件で削除ができるはず)が依然として ギャップロックされているように見える。。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。