Edited at

MySQLで遭遇したトランザクションとロックのお話(1)

More than 3 years have passed since last update.

DBについて発表した内容について詳しくかきます。

初回はトランザクションについて

資料のソース元はこちら

http://www.slideshare.net/takukobayashi560/my-sqltake2-2


トランザクションって?

トランザクション処理は、既知の一貫した状態のデータベースを維持するよう設計されており、相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証する。(by Wikipedia)

http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3


ドラゴンク○ストでの1場面

お店で薬草を1個購入すると



  • 所持Gから8Gが減る

  • 薬草の所持数が1個増える

となる。

ここで、もし


  • 薬草の所持数が1個増える

ところでエラーが発生して薬草が1個増えなかったら。


  • 所持Gから8Gが減る

だけ実行されてしまうので、ユーザーは激怒プンプン丸になってしまう。

なので、


  • 薬草の所持数が1個増える。

がエラーになったら、


  • 所持Gから8Gが減る

もなかったことにしたい。


  • 薬草の所持数が1個増える。

  • 所持Gから8Gが減る
    の処理をセットで見て、両方とも反映完了するか両方ともなかったことにするようにする必要がある。

このように処理をセットとして扱うことをトランザクションという。

そして、トランザクションを終了するとき、両方とも反映完了とする時をコミット(COMMIT)

両方ともなかったことにすることをロールバック(ROLLBACK)

という


コード


  • SQL

BEGIN

~
COMMIT 又は ROLLBACK


  • Ruby on Rails

ActiveRecord::Base.transaction do

~
end

こんな感じに書く。

排他制御

楽観ロック

悲観ロックについては次回へ