Help us understand the problem. What is going on with this article?

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

More than 5 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

201205268.jpg

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

図1.jpg

お店で薬草を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

こんな感じに書く。

排他制御
楽観ロック
悲観ロックについては次回へ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away