トランズアクション
データの不整合が起きないように制御をするための仕組みが用意されている。それがトランズアクション
複数のSQLクエリ(SQLデータベースにだす命令)を1つの作業としてまとめたもの
-
Aさんの銀行口座の残高が10,000円以上であることを確認する。
-
Aさんの銀行口座の残高から10,000円を引く。
-
Bさんの銀行口座の残高に10,000円を足す。
この一連の手順が正常に終われば、振り込みは完了です。しかし、途中でトラブルが発生し、処理が中断されることがあるかもしれません。いずれかのステップで失敗した場合は、ロールバックしたいですね。そこで登場するのがトランザクションです。上記の一連の手順をトランザクションとしてまとめておくと、いずれかのステップで失敗した場合にロールバックを行ってくれます。
トランズアクションの初めはBEGIN TRANSACTION
終わりはCOMMIT TRANSACTION
->参照
http://shindolog.hatenablog.com/entry/2015/04/01/185703
http://www.atmarkit.co.jp/ait/articles/0210/24/news001.html
##SQLのロック
トランザクション中のデータベースへのアクセスを制御するために、RDBMSはデータベースに対して「ロック」を掛けます。
共有ロックと排他ロック
排他ロックは対象行を全てのクエリからロックする。UPDATEやDELETEなどの更新クエリはもちろん、SELECTなどの読み取りクエリも通さない。
共有ロックは更新クエリを通さないが、読み取りクエリは通す。
メールの読み取りの時に、複数の人が読み取りだけだったらデータの不整合は起こらないが、一人の人が読み取って、一人の人が書き込む場合には排他的ロックをかけないといけない
->参照 http://qiita.com/mizzwithliam/items/31fb68217899bd0559e8
ステートメントに適したインデックスがなく、MySQL がステートメントを処理するためにテーブル全体をスキャンする必要がある場合は、テーブルのすべての行がロックされます。その結果、そのテーブルへのほかのユーザーによるすべての挿入がブロックされます。クエリーで不必要に複数の行がスキャンされないように、適切なインデックスを作成することが重要です。