mysql update デッドロック whereの条件をプライマリキーにする
mysqlのupdateでデッドロックが起こっていました。
他のsqlと絡む処理の時に起こっていたようです。
結論.
ロックの行数を少なくすることで解決.
updateする前にselectでプライマリキーを取得し、
それを使い、絞り込む際の条件をプライマリキーにすることにより、
ロックの行数を1つに減らすことで対処.
修正前.
update テーブル名 set ~~ where カラム = インデックスなしのカラム;
mysql> SELECT trx_rows_locked FROM information_schema.INNODB_TRX; +-----------------+ | trx_rows_locked | +-----------------+ | 135 | +-----------------+
修正後.
select プライマリキー from テーブル名 where ~~;(プライマリキーを取得) update テーブル名 set ~~ where カラム = プライマリキー;
mysql> SELECT trx_rows_locked FROM information_schema.INNODB_TRX; +-----------------+ | trx_rows_locked | +-----------------+ | 1 | +-----------------+