Enviar pesquisa
Carregar
mysqlcasual6-next-key-lock
•
10 gostaram
•
12,377 visualizações
karupanerura
Seguir
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 27
Baixar agora
Baixar para ler offline
Recomendados
キロ秒・メガ秒
キロ秒・メガ秒
ken23455
MHA on AWS+Rails
MHA on AWS+Rails
Sugawara Genki
20140711 MySQL Casual Talks vol.6 / 続・Amazon RDS Casual Talks
20140711 MySQL Casual Talks vol.6 / 続・Amazon RDS Casual Talks
Mori Tetsuya
N:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
mysqlcasual6-fabric
mysqlcasual6-fabric
doublemarket
My sql casual talks vol.6
My sql casual talks vol.6
Satoshi Suzuki
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
TokuDB試してみる
TokuDB試してみる
yoku0825
Recomendados
キロ秒・メガ秒
キロ秒・メガ秒
ken23455
MHA on AWS+Rails
MHA on AWS+Rails
Sugawara Genki
20140711 MySQL Casual Talks vol.6 / 続・Amazon RDS Casual Talks
20140711 MySQL Casual Talks vol.6 / 続・Amazon RDS Casual Talks
Mori Tetsuya
N:1 Replication meets MHA
N:1 Replication meets MHA
do_aki
mysqlcasual6-fabric
mysqlcasual6-fabric
doublemarket
My sql casual talks vol.6
My sql casual talks vol.6
Satoshi Suzuki
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
TokuDB試してみる
TokuDB試してみる
yoku0825
Perl5 VS JSON
Perl5 VS JSON
karupanerura
コンテキストと仲良く
コンテキストと仲良く
karupanerura
The plan of Aniki 2.0
The plan of Aniki 2.0
karupanerura
Aniki::Internal
Aniki::Internal
karupanerura
The Crystal language *recently* update
The Crystal language *recently* update
karupanerura
KOWAZA for mackerel
KOWAZA for mackerel
karupanerura
TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=
karupanerura
DateTimeX::Moment
DateTimeX::Moment
karupanerura
Aniki has come
Aniki has come
karupanerura
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaks
karupanerura
Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術
karupanerura
router-simple.cr
router-simple.cr
karupanerura
Why we use mruby with Perl5?
Why we use mruby with Perl5?
karupanerura
はかたの塩
はかたの塩
karupanerura
Gotanda.pmの紹介
Gotanda.pmの紹介
karupanerura
すいすいSwift
すいすいSwift
karupanerura
Perlにおけるclass実装パターン
Perlにおけるclass実装パターン
karupanerura
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤
karupanerura
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.
karupanerura
Perl5 meta programming
Perl5 meta programming
karupanerura
Mais conteúdo relacionado
Mais de karupanerura
Perl5 VS JSON
Perl5 VS JSON
karupanerura
コンテキストと仲良く
コンテキストと仲良く
karupanerura
The plan of Aniki 2.0
The plan of Aniki 2.0
karupanerura
Aniki::Internal
Aniki::Internal
karupanerura
The Crystal language *recently* update
The Crystal language *recently* update
karupanerura
KOWAZA for mackerel
KOWAZA for mackerel
karupanerura
TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=
karupanerura
DateTimeX::Moment
DateTimeX::Moment
karupanerura
Aniki has come
Aniki has come
karupanerura
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaks
karupanerura
Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術
karupanerura
router-simple.cr
router-simple.cr
karupanerura
Why we use mruby with Perl5?
Why we use mruby with Perl5?
karupanerura
はかたの塩
はかたの塩
karupanerura
Gotanda.pmの紹介
Gotanda.pmの紹介
karupanerura
すいすいSwift
すいすいSwift
karupanerura
Perlにおけるclass実装パターン
Perlにおけるclass実装パターン
karupanerura
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤
karupanerura
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.
karupanerura
Perl5 meta programming
Perl5 meta programming
karupanerura
Mais de karupanerura
(20)
Perl5 VS JSON
Perl5 VS JSON
コンテキストと仲良く
コンテキストと仲良く
The plan of Aniki 2.0
The plan of Aniki 2.0
Aniki::Internal
Aniki::Internal
The Crystal language *recently* update
The Crystal language *recently* update
KOWAZA for mackerel
KOWAZA for mackerel
TIme::Moment+Time::Strptime=
TIme::Moment+Time::Strptime=
DateTimeX::Moment
DateTimeX::Moment
Aniki has come
Aniki has come
Optimize perl5 code for perfomance freaks
Optimize perl5 code for perfomance freaks
Technology for reduce of mistakes - うっかりをなくす技術
Technology for reduce of mistakes - うっかりをなくす技術
router-simple.cr
router-simple.cr
Why we use mruby with Perl5?
Why we use mruby with Perl5?
はかたの塩
はかたの塩
Gotanda.pmの紹介
Gotanda.pmの紹介
すいすいSwift
すいすいSwift
Perlにおけるclass実装パターン
Perlにおけるclass実装パターン
モジュール開発におけるぼくの試行錯誤
モジュール開発におけるぼくの試行錯誤
Aniki - The ORM as our great brother.
Aniki - The ORM as our great brother.
Perl5 meta programming
Perl5 meta programming
mysqlcasual6-next-key-lock
1.
MySQL Casual Talks
#6 LT next-key lock id:karupanerura
2.
だれ? ❖ id:karupanerura ❖ Perl/JS/Java/MySQL/... ❖
Gotanda.pm author ❖ 9月に2回目やるよ ❖ YAPC::Asia 2014 ❖ perl5 meta programming ❖ Web Application Engineer
3.
みなさん
4.
今日も元気に
5.
Transactionかけてますか!
6.
Transaction分離レベル(1) ❖ READ UNCOMMITED ❖
COMMITされていないデータが取れるよ ❖ 並列性能は最強だがデータの一貫性は保証されない ❖ READ COMMITED ❖ COMMITされたデータがその瞬間から取れるよ ❖ 他のTransactionの変更も読む事になる ❖ 一貫性は保証されないが若干まともになる
7.
Transaction分離レベル(2) ❖ SERIALIZE ❖ 同時に複数のTransactionは走らせないよ ❖
一貫性は保証されるけど並列性能が下がる ❖ REPEATABLE READ ❖ 同じTransaction内では常に同じデータが取れるよ ❖ 他のTransactionの更新を無視する ❖ ファントムリードが発生する
8.
ファントムリード?
9.
ファントムリード ❖ 他のTransactionによって挿入されたデータが読めて しまう現象 ❖ さっきまで無かった筈の行がTransactionの途中か ら出現したりする ❖
REPEATABLE READの場合、挿入は影響してしまう
10.
これは困った!
11.
SERIALIZEを使うしかないのか!?
12.
InnoDBの場合
13.
InnoDBの場合 next-key lockがあるよ!
14.
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以上のロック
15.
next-key locking ❖ REPEATABLE
READで一貫性を保証するためのlock ❖ record lockとその前のgap lockを取得する ❖ gapのlockによって行の挿入を防ぐ
16.
勘所 ❖ 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
17.
図解(FOR UPDATEなケース)
18.
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;
19.
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 | +----+------+------+
20.
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 | +-----+------+------+
21.
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)| +-----+------+------+
22.
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)| +-----+------+------+
23.
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 | +-----+------+------+
24.
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 | +-----+------+------+
25.
まとめ
26.
まとめ ❖ 試してみた感じこういう挙動だと思った ❖ わかってないかもしれない ❖
そろそろtwitterでマサカリが飛ぶ頃 ❖ SHOW ENGINE INNODB STATUS ¥G ❖ 読むの経験と力が要りそう ❖ 鍵本片手に読まないとよくわからない ❖ カジュアルに可視化したい
27.
おわり
Baixar agora