MySQLのデフォルトストレージエンジンInnoDBのロックの挙動をイメージするために作られたおもちゃ。
おもちゃなので軽い気持ちでポチポチと遊んでください(^o^)/
ただし、あくまで作者の頭の中のindex走査のイメージを可視化したものであって、正しくInnoDBの挙動を表しているものではないのでご注意ください。
間違いや改善案を見つけた方はIssueもしくはPullRequestsを作って頂けると嬉しいです。=> GitHub
Record Lock | レコード単位のロック。例えばselect for updateで獲得できる。 |
Gap Lock | 単に抑制的(purely inhibitive)でGapへのデータ挿入を許さないだけのロック。select for updateとは競合しないので注意。 |
Next-key Lock | 効果はレコードロックと同様。最後にスキャンされた行の次の行にかかるレコードロック。 |
口座情報を管理するaccountsテーブル。カラムはidとbalanceだけのシンプルな設計。
idにはPRIMARY KEY制約がかかっている。balanceにはindexが張られていないものとする。
また、index走査はid昇順で動く設定とする。
accountsテーブル
id | balance |
---|---|
Gap: -∞ ~ -1 | - |
1 | 100 |
2 | 200 |
3 | 300 |
4 | 400 |
5 | 500 |
Gap: 6 ~ 9 | - |
10 | 1000 |
Gap: 11 ~ 19 | - |
20 | 2000 |
Gap: 21 ~ +∞ | - |
select * from accounts for update
{where clause}
Reset where balance = 500 where id = 3 where id = 8 where id = 10 where id = 25 where id < 3 where id < 8 where id > 3 where id > 8 where id <= 3 where id <= 5 where id <= 8 where id >= 3 where id >= 5 where id >= 8