Submit Search
Upload
こわくない同時実行制御
•
11 likes
•
10,859 views
Hiraku Nakano
Follow
ゆるかわPHP #2で話しました
Read less
Read more
Technology
Report
Share
Report
Share
1 of 43
Download now
Download to read offline
Recommended
LibreOffice API について
LibreOffice API について
健一 辰濱
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
Hiroshi Tokumaru
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
parrotstudio
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
Kenichi Hironaka
基礎からのベイズ統計学第5章
基礎からのベイズ統計学第5章
hiro5585
ドロネー三角形分割
ドロネー三角形分割
Yusuke Matsushita
なぜベイズ統計はリスク分析に向いているのか? その哲学上および実用上の理由
なぜベイズ統計はリスク分析に向いているのか? その哲学上および実用上の理由
takehikoihayashi
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
Recommended
LibreOffice API について
LibreOffice API について
健一 辰濱
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
Hiroshi Tokumaru
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
parrotstudio
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
渡辺澄夫著「ベイズ統計の理論と方法」5.1 マルコフ連鎖モンテカルロ法
Kenichi Hironaka
基礎からのベイズ統計学第5章
基礎からのベイズ統計学第5章
hiro5585
ドロネー三角形分割
ドロネー三角形分割
Yusuke Matsushita
なぜベイズ統計はリスク分析に向いているのか? その哲学上および実用上の理由
なぜベイズ統計はリスク分析に向いているのか? その哲学上および実用上の理由
takehikoihayashi
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
#みどりぼん 11章「空間構造のある階層ベイズモデル」後半
#みどりぼん 11章「空間構造のある階層ベイズモデル」後半
Katsushi Yamashita
カルマンフィルタ入門
カルマンフィルタ入門
Yasunori Nihei
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
Hajime Fujita
自然言語処理に基づく商品情報の整理および構造化
自然言語処理に基づく商品情報の整理および構造化
Rakuten Group, Inc.
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
kurikiyo
営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面
Masao Maeda
ドメイン駆動設計入門
ドメイン駆動設計入門
Takuya Kitamura
Ormとの付き合い方
Ormとの付き合い方
豊明 尾古
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
Ra Zon
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Kazumi IWANAGA
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
「世界モデル」と関連研究について
「世界モデル」と関連研究について
Masahiro Suzuki
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
TAKUYA OHTA
ラグランジュ未定乗数法
ラグランジュ未定乗数法
弘毅 露崎
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
ASTERIA WARPをもっと便利に使いこなすためのtips紹介
ASTERIA WARPをもっと便利に使いこなすためのtips紹介
ASTERIA User Group
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
Yoshitaka Kawashima
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
データベース08 - 関係データモデルと関係代数
データベース08 - 関係データモデルと関係代数
Kenta Oku
JSON SchemaとPHP
JSON SchemaとPHP
Hiraku Nakano
More Related Content
What's hot
#みどりぼん 11章「空間構造のある階層ベイズモデル」後半
#みどりぼん 11章「空間構造のある階層ベイズモデル」後半
Katsushi Yamashita
カルマンフィルタ入門
カルマンフィルタ入門
Yasunori Nihei
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
Hajime Fujita
自然言語処理に基づく商品情報の整理および構造化
自然言語処理に基づく商品情報の整理および構造化
Rakuten Group, Inc.
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
kurikiyo
営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面
Masao Maeda
ドメイン駆動設計入門
ドメイン駆動設計入門
Takuya Kitamura
Ormとの付き合い方
Ormとの付き合い方
豊明 尾古
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
Ra Zon
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Kazumi IWANAGA
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
「世界モデル」と関連研究について
「世界モデル」と関連研究について
Masahiro Suzuki
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
TAKUYA OHTA
ラグランジュ未定乗数法
ラグランジュ未定乗数法
弘毅 露崎
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
ASTERIA WARPをもっと便利に使いこなすためのtips紹介
ASTERIA WARPをもっと便利に使いこなすためのtips紹介
ASTERIA User Group
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
Yoshitaka Kawashima
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
What's hot
(20)
#みどりぼん 11章「空間構造のある階層ベイズモデル」後半
#みどりぼん 11章「空間構造のある階層ベイズモデル」後半
カルマンフィルタ入門
カルマンフィルタ入門
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
自然言語処理に基づく商品情報の整理および構造化
自然言語処理に基づく商品情報の整理および構造化
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
アップルの特許に見るUI特許のポイント
アップルの特許に見るUI特許のポイント
営業・運用を支える "気付ける" 管理画面
営業・運用を支える "気付ける" 管理画面
ドメイン駆動設計入門
ドメイン駆動設計入門
Ormとの付き合い方
Ormとの付き合い方
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
「世界モデル」と関連研究について
「世界モデル」と関連研究について
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
ハードコア デバッギング : サポート直伝!運用中 Windows アプリケーション バグバスター!!
ラグランジュ未定乗数法
ラグランジュ未定乗数法
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
ASTERIA WARPをもっと便利に使いこなすためのtips紹介
ASTERIA WARPをもっと便利に使いこなすためのtips紹介
イマドキのExcelスクショの撮り方
イマドキのExcelスクショの撮り方
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
Viewers also liked
データベース08 - 関係データモデルと関係代数
データベース08 - 関係データモデルと関係代数
Kenta Oku
JSON SchemaとPHP
JSON SchemaとPHP
Hiraku Nakano
My sqlで遭遇したトランザクションとロックのお話take2 2
My sqlで遭遇したトランザクションとロックのお話take2 2
拓 小林
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
nisobe58
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のこと
leverages_event
IPDPS & HPDC 報告
IPDPS & HPDC 報告
Junya Arai
UI/UXなUXのお話
UI/UXなUXのお話
Kenji Minamoto
SkipGraph
SkipGraph
Kumazaki Hiroki
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
Takashi Hoshino
Sparkのクエリ処理系と周辺の話題
Sparkのクエリ処理系と周辺の話題
Takeshi Yamamuro
MySQL INDEX+EXPLAIN入門
MySQL INDEX+EXPLAIN入門
infinite_loop
STAC2015 講演3 広告システム刷新よもやま話〜テストが当たり前となるまでにやったこと #stac2015
STAC2015 講演3 広告システム刷新よもやま話〜テストが当たり前となるまでにやったこと #stac2015
Yahoo!デベロッパーネットワーク
Slideshare signup tutorial
Slideshare signup tutorial
bestabrook
プレゼン初心者に ありがちな アンチパターン 黎明篇
プレゼン初心者に ありがちな アンチパターン 黎明篇
真俊 横田
並行実行制御の最適化手法
並行実行制御の最適化手法
Sho Nakazono
トランザクションの設計と進化
トランザクションの設計と進化
Kumazaki Hiroki
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
Takahiro YAMAGUCHI
初心者向けMySQLの始め方
初心者向けMySQLの始め方
Masahiro Tomita
composer-scriptsについて
composer-scriptsについて
Hiraku Nakano
Viewers also liked
(20)
データベース08 - 関係データモデルと関係代数
データベース08 - 関係データモデルと関係代数
JSON SchemaとPHP
JSON SchemaとPHP
My sqlで遭遇したトランザクションとロックのお話take2 2
My sqlで遭遇したトランザクションとロックのお話take2 2
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
RDB入門 ~アプリケーション開発者が陥りやすいDB開発の落とし穴~
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のこと
IPDPS & HPDC 報告
IPDPS & HPDC 報告
UI/UXなUXのお話
UI/UXなUXのお話
SkipGraph
SkipGraph
トランザクションの並行実行制御 rev.2
トランザクションの並行実行制御 rev.2
Sparkのクエリ処理系と周辺の話題
Sparkのクエリ処理系と周辺の話題
MySQL INDEX+EXPLAIN入門
MySQL INDEX+EXPLAIN入門
STAC2015 講演3 広告システム刷新よもやま話〜テストが当たり前となるまでにやったこと #stac2015
STAC2015 講演3 広告システム刷新よもやま話〜テストが当たり前となるまでにやったこと #stac2015
Slideshare signup tutorial
Slideshare signup tutorial
プレゼン初心者に ありがちな アンチパターン 黎明篇
プレゼン初心者に ありがちな アンチパターン 黎明篇
並行実行制御の最適化手法
並行実行制御の最適化手法
トランザクションの設計と進化
トランザクションの設計と進化
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
初心者向けMySQLの始め方
初心者向けMySQLの始め方
composer-scriptsについて
composer-scriptsについて
More from Hiraku Nakano
composerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudy
Hiraku Nakano
Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt
Hiraku Nakano
Scrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudy
Hiraku Nakano
PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介
Hiraku Nakano
pecl-AOPの紹介
pecl-AOPの紹介
Hiraku Nakano
URLで遊ぼう
URLで遊ぼう
Hiraku Nakano
Xml builderの紹介
Xml builderの紹介
Hiraku Nakano
More from Hiraku Nakano
(7)
composerの遅さをまじめに考える #phpstudy
composerの遅さをまじめに考える #phpstudy
Composer並列化プラグイン #phpblt
Composer並列化プラグイン #phpblt
Scrutinizer CIでPHPも静的解析 #phpstudy
Scrutinizer CIでPHPも静的解析 #phpstudy
PSR-3 Logger Interfaceの紹介
PSR-3 Logger Interfaceの紹介
pecl-AOPの紹介
pecl-AOPの紹介
URLで遊ぼう
URLで遊ぼう
Xml builderの紹介
Xml builderの紹介
Recently uploaded
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
Recently uploaded
(7)
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
こわくない同時実行制御
1.
こわくない同時実行制御 @Hiraku
2.
おことわり • 荒い説明なので突っ込みどころ多いと思います • 「同時実行制御って難しそうだけど面白いな♪」ぐらいになれ ばうれしい
3.
自己紹介 • @Hiraku (中野
拓) • PHP歴5年+ • 使ったことのあるフレームワーク • Zend Framework1 • Symfony • Yaf • BEAR.Sunday • XMLとJSONの相互変換ライブラリ作ってます • https://github.com/hirak/php-XML_Builder
4.
目次 • 同時実行制御とは • 考慮するべき不具合 •
解決手法
5.
同時実行制御 Concurrency Control
6.
同時実行制御とは • あるデータを、複数の人が同時に扱えるようにすることを考え る分野 • 例:共有のExcel進捗管理表 さっき僕が 追記した内容が 上書きされて 消えちゃってる よ! 内容を変更 したよー
7.
同時実行 制御 並列並行 プログラミング DB トランザクション バージョン管理 システム (git, svn)
8.
同時実行制御は応用範囲が広い • 並列プログラミング • DBトランザクション •
バージョン管理システム • 逆に、同時実行制御さえ理解しておけば、上記3つのシステム が理解しやすくなる • イモヅル式!
9.
教科書 • 先述の3つの分野では必ず同時実行制御が必要になる • どこから勉強しても行き着く •
わたしはSQLから攻めました。 いいのがあったら教えてください • http://www.amazon.co.jp/dp/4798128023 • 資格試験の教科書なんかでも登場するかも…?
10.
同時実行制御を理解するために 1. 何も制御しなければどんな不具合が起きるのか理解する 2. どうすれば防げるのか理解する
11.
同時実行制御の失敗 で起きる問題 整理して名前を付けてくれた人がいるんです
12.
制御しないと問題が起きる • 具体的な問題って何? • SQLモデルによる定義があります •
http://research.microsoft.com/apps/pubs/default.aspx?id=69541 • 5つに分類 • P0 ダーティライト • P1 ダーティーリード • P2 ノンリピータブルリード(ファジーリード) • P3 ファントム • P4 ロストアップデート
13.
SQL的考え方で説明します • 一連のまとまった操作=トランザクション(Tx) • 基本的に、自分のTxが変更を行っていないのに、 データが勝手に変更されていると、不具合の原因になる
14.
P0 ダーティライト • Tx中に他のTxが書き込め ちゃう状態 •
正しい値が何だったのか わからなくなる Tx1 Tx2 UPDATE x=1 UPDATE x=2 Data x=0 x=1 x=2 rollback x=??
15.
P1 ダーティリード • Tx中の変更が他のTx から読めちゃう状態 Tx1
Tx2 X=1 y = x + 1 (2) Data X=0, y=0 x=1 y=0 x=1 y=2 rollback x=0 y=?? SELECT x
16.
P2 ノンリピータブルリード • 他のTxによって データが勝手に 書き換わってい ること Tx1
Tx2 SELECT x x=1 Data x=0 x=0 x=1 SELECT x x=1 x=0 x=1 SELECTに再現性がない
17.
P3 ファントム • 他のTxの操作によっ て謎のデータが突如 出現すること •
ノンリピータブル リードと対 Tx1 Tx2 SELECT x FROM Data INSERT Data (x=0) (x=0) (x=0) (x=1) SELECT x FROM Data (x=0) (x=1) 1件hit 2件hit SELECTに再現性がない
18.
P4 ロストアップデート • 同時更新のうち、 早かった方の更新 が失われてしまう •
インクリメントの 制御など Tx1 Tx2 SELECT x SELECT x Data x=0 x=0 x=1x = x + 1 x=1 手動インクリメントの ロスト x=0 x=0 x = x + 1
19.
SQLの場合 • トランザクション分離レベルで制御できます 分離レベル P0 ダーティライト P1 ダーティリード P2 アンリピータブ ルリード P3 ファントム READ UNCOMMITTED 起きない
発生する 発生する 発生する READ COMMITTED 起きない 起きない 発生する 発生する REPEATABLE READ 起きない 起きない 起きない 発生する SERIALIZABLE 起きない 起きない 起きない 起きない ※MySQL InnoDBのデフォルトはREPEATABLE READ
20.
対処方法 色々やり方があります
21.
基本方針 • 競合が起きる条件を崩せば、問題は発生しない • 更新がある •
複数トランザクションが同時に同じデータを更新する • この2つの条件をいかにして崩すか。
22.
対処方法0 書き込まない • 読み込みのみであれば、問題は一切発生しない •
何も考えなくてよい。同時に読み込んでOK • 書き込みはバッチ処理に任せるケースも • もちろん、適用できるケースは限られる
23.
対処方法1 同時実行しない • 同時実行を一切しなければ、これらの問題は絶対に起きない •
直列化 (Serialization) とも言う • いったんキューに貯めて、リソースが空くのを待つ
24.
直列化の問題 • パフォーマンスが落ちる • スケーラビリティ皆無 •
実質ひとつのプロセッサが全作業を行うのと同じ • これでは実用にならないケースも多い…
25.
対処方法はここから分岐します ロック バージョン 管理
26.
対処方法2-a ロック(Locking) • 悲観的同時実行制御とも呼ばれる •
リソースに鍵をかけて、一度に一人しか触れないようにする • 部分的に直列化 • ロックされていたら、ロックが解除されるまで待つ • 直列化は全リソースをまとめてロックするのと同じ • 適切に使えば問題を完璧に防げる
27.
個室トイレっぽい リソース 使用中 or 使っていいよ 使いたいプロセスはアンロック されるまで待つ
28.
ロックの粒度 • テーブルロック • (清掃中につきトイレ全体立ち入り禁止) •
行ロック • (個室の使用中・空きの制御) • 読み込みだけなら許可するロック • 読み込みも書き込みも許可しないロック • 大きくロックした方が安全だけど、 その分パフォーマンスが劣化する
29.
ロックの問題 • 使いこなすのがむちゃくちゃ難しい • ロックのかけすぎでパフォーマンスが出ない •
アンロック忘れにより破滅 • ロックの順番 • デッドロック • 再利用性の低下
30.
アンロック忘れ • ロックしっぱなしにすると、永久に他のトランザクションがそ のリソースを扱えなくなる • うっかりミス •
攻撃
31.
デッドロック • ロックの順番を統一していな いと発生 • 永久にロックが取れない •
第2回 トランザクションを知ればデータベー スがわかる―「データ復旧」「同時実行制御」 を行う“不完全な”しくみ(3):DBアタマアカ デミー|gihyo.jp … 技術評論社 • http://gihyo.jp/dev/serial/01/db- academy/000203
32.
ロックは地獄だぜー • ロックは難しい • 細かく書いていくとたぶん本ができあがる •
扱うにしても、なるべく先人たちの実装を再利用しましょう • DBなら組み込みのトランザクションを使う • ファイルならgitを使う • 参考: できる!並列・並行プログラミング http://www.slideshare.net/pfi/ss-9780450
33.
対処方法2-b バージョン管理 • 楽観的同時実行制御とも呼ばれる •
データにリビジョン番号を振り、改竄を検出できるようにする • データ改竄を検出したらやり直すかマージする • ロックより簡単 • 競合が多いとパフォーマンスが落ちる • リトライしまくるので、ロックより劣化する
34.
• 競合が発覚したら • リトライ •
マージ リソース (1) バージョンを取得しておく (2) バージョンを取得しておく (3) ver1をベースにして、 データを更新するよー (4)ver1をベースにして、 データを更新するよー Ver 1 Ver 2 元にしたデータが 古いよ! 受け入れません
35.
バージョンの粒度 • テーブル全体のバージョン • 行のバージョン •
ロックの粒度と対比
36.
STM (Software Transactional
Memory) • バージョン管理方式を使った並行プログラミングの手法 • 更新が競合する場合は1からやり直す • 割と単純なモデル
37.
Git, svn方式 • マージの概念をプラス •
マージもうまくできない場合、最初からやり直す
38.
実際、同時実行制御と どう付き合っていくか 理屈はわかったんだけど
39.
なるべくなら自分で実装しない • DBのトランザクションが使えるなら素直にそれを使う • 自前実装はイバラの道 •
やるならバージョン管理方式の方がお手軽で楽
40.
扱うデータの種類を見極める • 例) PHPのセッション •
同時に同じセッションデータを読み書きすることはほとんどない • 同時実行が起きないので制御を考えなくていい • MemcachedとかのKVSで十分 • データの種類にあった同時実行制御を行えば、パフォーマンス が向上する • トランザクション分離レベルを操るところからでも
41.
RESTとトランザクション • WebAPI作ってますか • WebAPIで同時実行制御のことを考えていますか •
せっかくMySQLを使っているのに、オレオレWebAPI化によっ て同時実行制御が破綻しているケースをよく見かける • 条件付き更新に対応しておけば大丈夫
42.
まとめ • 同時実行制御は難しいですが、色々な分野で登場します • わかると意外と役に立つかも •
我々凡人はなるべく先人たちの実装を使いましょう • Git • DBのトランザクション • 自前実装する場合は気を付けましょう
43.
同時実行制御 こわくないよ!!
Download now