2017-12-10 22 views
0
  • テーブルfooにはIDと名前があります。
  • トランザクションA ID 1による更新を選択します。
  • トランザクションBは、ID 1で更新を選択して待機します。
  • トランザクションAは、(存在しないにもかかわらず)名前で更新を選択すると、トランザクションBデッドロックが発生します。

これはどうしてですか?MySQLでのdiffrenetキーの原因デッドロックによる同じテーブルへの更新の選択

以下のスクリプトはデッドロックを再現します。

create table foo (id int primary key, name varchar(100)); 
insert into foo values (1, 'foo1'); 

-- transaction A 
start transaction; 
select * from foo where id=1 for update; 

-- transaction B 
start transaction; 
select * from foo where id=1 for update; 
-- now waiting 

-- transaction A 
select * from foo where name='xxxxx' for update; 
-- transaction B dead lock occer 

答えて

0

私は近い答えを見つけました。

インデックス付きカラムで検索された更新を選択すると、MySQLはすべてのレコードをロックします。

https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html

あなたの文に適したいかなるインデックスを持っていないとMySQLがステートメントを処理するために、テーブル全体をスキャンする必要がある場合は、テーブルのすべての行がロックされてなり、そのほかのユーザーによってターンブロック内のすべてのインサートへテーブル。

しかし、なぜデッドロックが発生するのかわかりません。

ところで、私はすべての主キーで検索する更新を選択するという問題を解決しました。

関連する問題