Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
DateTimeX::Moment
karupanerura
Aniki has come
karupanerura
Optimize perl5 code for perfomance freaks
karupanerura
Technology for reduce of mistakes - うっかりをなくす技術
karupanerura
router-simple.cr
karupanerura
Why we use mruby with Perl5?
karupanerura
はかたの塩
karupanerura
Gotanda.pmの紹介
karupanerura
1
of
27
Top clipped slide
mysqlcasual6-next-key-lock
Jul. 11, 2014
•
0 likes
10 likes
×
Be the first to like this
Show More
•
12,351 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
karupanerura
Follow
Software Developer at D
Advertisement
Advertisement
Advertisement
Recommended
キロ秒・メガ秒
ken23455
434 views
•
1 slide
Perl5 VS JSON
karupanerura
1.3K views
•
33 slides
コンテキストと仲良く
karupanerura
3.3K views
•
38 slides
The plan of Aniki 2.0
karupanerura
4.4K views
•
36 slides
Aniki::Internal
karupanerura
7.7K views
•
18 slides
The Crystal language *recently* update
karupanerura
774 views
•
32 slides
More Related Content
More from karupanerura
(20)
DateTimeX::Moment
karupanerura
•
933 views
Aniki has come
karupanerura
•
4.1K views
Optimize perl5 code for perfomance freaks
karupanerura
•
5K views
Technology for reduce of mistakes - うっかりをなくす技術
karupanerura
•
9.7K views
router-simple.cr
karupanerura
•
1.7K views
Why we use mruby with Perl5?
karupanerura
•
4.7K views
はかたの塩
karupanerura
•
948 views
Gotanda.pmの紹介
karupanerura
•
1.2K views
すいすいSwift
karupanerura
•
1.9K views
Perlにおけるclass実装パターン
karupanerura
•
1.9K views
モジュール開発におけるぼくの試行錯誤
karupanerura
•
4.2K views
Aniki - The ORM as our great brother.
karupanerura
•
2.2K views
Perl5 meta programming
karupanerura
•
3.7K views
dwangocpp1-lt
karupanerura
•
1.7K views
engineer-life
karupanerura
•
773 views
若手Itエンジニア飲み会-LT
karupanerura
•
949 views
Hachioji.pm #40
karupanerura
•
736 views
Hachioji.pm #39
karupanerura
•
579 views
perl5の日付時刻処理とか
karupanerura
•
2.7K views
Yapc asia-2012-lt-thon
karupanerura
•
1.6K views
Advertisement
mysqlcasual6-next-key-lock
MySQL Casual Talks
#6 LT next-key lock id:karupanerura
だれ? ❖ id:karupanerura ❖ Perl/JS/Java/MySQL/... ❖
Gotanda.pm author ❖ 9月に2回目やるよ ❖ YAPC::Asia 2014 ❖ perl5 meta programming ❖ Web Application Engineer
みなさん
今日も元気に
Transactionかけてますか!
Transaction分離レベル(1) ❖ READ UNCOMMITED ❖
COMMITされていないデータが取れるよ ❖ 並列性能は最強だがデータの一貫性は保証されない ❖ READ COMMITED ❖ COMMITされたデータがその瞬間から取れるよ ❖ 他のTransactionの変更も読む事になる ❖ 一貫性は保証されないが若干まともになる
Transaction分離レベル(2) ❖ SERIALIZE ❖ 同時に複数のTransactionは走らせないよ ❖
一貫性は保証されるけど並列性能が下がる ❖ REPEATABLE READ ❖ 同じTransaction内では常に同じデータが取れるよ ❖ 他のTransactionの更新を無視する ❖ ファントムリードが発生する
ファントムリード?
ファントムリード ❖ 他のTransactionによって挿入されたデータが読めて しまう現象 ❖ さっきまで無かった筈の行がTransactionの途中か ら出現したりする ❖
REPEATABLE READの場合、挿入は影響してしまう
これは困った!
SERIALIZEを使うしかないのか!?
InnoDBの場合
InnoDBの場合 next-key lockがあるよ!
MySQLのlock ❖ record lock ❖
単一のindex recordのロック ❖ e.g.) PRIMARY KEYが1のヤツ ❖ gap lock ❖ index recordの間、先頭、末尾のロック ❖ e.g. 1) PRIMARY KEYが1~3の間のロック ❖ e.g. 2) PRIMARY KEYが3以上のロック
next-key locking ❖ REPEATABLE
READで一貫性を保証するためのlock ❖ record lockとその前のgap lockを取得する ❖ gapのlockによって行の挿入を防ぐ
勘所 ❖ index record
lockである ❖ covering indexの場合などはlock範囲が異なる ❖ http://blog.kamipo.net/entry/2013/12/03/235900 ❖ クエリによってロック範囲が細かく異なる ❖ MySQLの公式のドキュメントが詳しい ❖ InnoDB 内で各種 SQL ステートメントによって設定されるロック ❖ http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locks-set.html
図解(FOR UPDATEなケース)
schema mysql> CREATE TABLE
`mysqlcasual` ( `id` int(11) NOT NULL AUTO_INCREMENT, `col1` int(11) NOT NULL, `col2` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `idx_col1` (`col1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
data mysql> SELECT *
FROM mysqlcasual; +----+------+------+ | id | col1 | col2 | +----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +----+------+------+
WHERE col1 =
6 +-----+------+------+ | id | col1 | col2 | +-----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +-----+------+------+
WHERE col1 >
6 +-----+------+------+ | id | col1 | col2 | +-----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | |(gap)| (gap)| (gap)| | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | |(gap)| (gap)| (gap)| +-----+------+------+
WHERE col1 >=
6 +-----+------+------+ | id | col1 | col2 | +-----+------+------+ | 1 | 2 | 0 | | 2 | 4 | 0 | |(gap)| (gap)| (gap)| | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | |(gap)| (gap)| (gap)| +-----+------+------+
WHERE col1 <
6 +-----+------+------+ | id | col1 | col2 | +-----+------+------+ |(gap)| (gap)| (gap)| | 1 | 2 | 0 | | 2 | 4 | 0 | |(gap)| (gap)| (gap)| | 3 | 6 | 0 | | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +-----+------+------+
WHERE col1 <=
6 +-----+------+------+ | id | col1 | col2 | +-----+------+------+ |(gap)| (gap)| (gap)| | 1 | 2 | 0 | | 2 | 4 | 0 | | 3 | 6 | 0 | |(gap)| (gap)| (gap)| | 4 | 8 | 0 | | 5 | 10 | 0 | | 6 | 12 | 0 | | 7 | 14 | 0 | | 8 | 16 | 0 | +-----+------+------+
まとめ
まとめ ❖ 試してみた感じこういう挙動だと思った ❖ わかってないかもしれない ❖
そろそろtwitterでマサカリが飛ぶ頃 ❖ SHOW ENGINE INNODB STATUS ¥G ❖ 読むの経験と力が要りそう ❖ 鍵本片手に読まないとよくわからない ❖ カジュアルに可視化したい
おわり
Advertisement