タグ

2018年1月7日のブックマーク (2件)

  • InnoDB の行レベルロックについて解説してみる

    自分の浅はかな理解だと、Deadlock が起こる理由が説明できないケースに遭遇したので、InnoDB の行レベルロックについて調べてまとめてみました。 「行レベルロックだと、同じ行を更新する場合にしか Deadlock が起こらないんでしょ」と思っているような人が対象です。 また、主に InnoDBのロックの範囲とネクストキーロックの話 - かみぽわーる を参考にさせていただいたので、そちらの内容がすんなり理解できる方には冗長な内容だと思います。 MySQL のバージョンは 5.6.33 です。 サンプルデータ 次の SQL で作成したデータを扱うことにします。 CREATE TABLE `orders` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(10) unsigned NOT NULL, `us

    InnoDB の行レベルロックについて解説してみる
  • mita2 DB メモ: MySQLのデッドロックについて

    MySQL (InnoDB) はデッドロック状態になった場合、片方のトランザクションを強制ロールバックし、もう片方のトランザクションに必要な ロックを獲得させ、処理を進める。その際、強制ロールバックされたクエリは以下のエラーが発生する。 mysql> UPDATE t1 SET col1 = 'session2' WHERE pk = 1; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction デッドロックの対処方法 1. リトライ 根的な対応ではないが、良くとられる解決策。 タイミング悪く更新が重なったときに起こる程度であれば、リトライで十分。 2. クエリを修正し、ロックを獲得する順番を揃える 上記の例でいうと、片方のトランザクションがt1→t2 という順でロックし