MySQL InnoDBのトランザクション

InnoDBの利用

最初にことわっておきますが、私はMySQLしか詳しくわかりません。ですから、トランザクションについての一般的説明はできません。ここではMySQLに限っての説明です。

また、ここではinnoDBでのトランザクションについて書きます。


トランザクションとは

トランザクションとは、一連のデータベース操作をひとかたまりとして、まためて実行できる機能です。また、付随機能として、更新の中断機能(これをロールバックという)があります。


トランザクションの例

たとえば、次のクエリーを順番に実行した場合の動作で考えてみます。 これは「おこずかい帳」というデータベースで、給料を1000円もらったときに、2つのテーブルを更新する場合の例です。

  1. UPDATE 現金出納テーブル SET 収入=収入+1000 WHERE 会計月=12
  2. UPDATE 給料テーブル SET 支給額=支給額+1000 WHERE 会計月=12

MyISAMであれば、1行ずつ実行されますから、わかりきったクエリーです。

しかし、このようなクエリーを実行すると、「現金出納テーブル」の更新が完了し、「給料テーブル」の更新は完了していないという状態が一瞬かもしれませんが発生します。

おこずかい帳程度であれば、これはほとんど問題がないのですが、複数ユーザーが同時に利用する会計処理などではたいへん困ったことになります。ある時点での収入額は、テーブルによって不一致が発生する危険性がたいへん高いです。

そこで、このような「一連の更新」をひとまとめにしてやってしまおうというのがトランザクションです。

innoDBテーブルで次のクエリーを実行すると、「COMMIT」時に一括更新されるようになります。

  1. START TRANSACTION
  2. UPDATE 現金出納テーブル SET 収入=収入+1000 WHERE 会計月=12
  3. UPDATE 給料テーブル SET 支給額=支給額+1000 WHERE 会計月=12
  4. COMMIT

また、行レベル・ロックが自動的に適用されるため、他のクライアントから見ると、いつも必ず「現金出納テーブル」と「給料テーブル」のデータ整合性は取れているということになります。

参考程度に、MyISAMで同様のクエリーを実行する場合、次のようにする必要があります。テーブル自体をロックしてしまっています。

  1. LOCK TABLES 現金出納テーブル WRITE, 給料テーブル WRITE
  2. UPDATE 現金出納テーブル SET 収入=収入+1000 WHERE 会計月=12
  3. UPDATE 給料テーブル SET 支給額=支給額+1000 WHERE 会計月=12
  4. UNLOCK TABLES

ロールバック

トランザクション実行中に、何らかの理由で途中までの更新クエリーを廃棄してしまうことが可能です。以下の例では「ROLLBACK」によって更新クエリーをすべて廃棄しています。

  1. START TRANSACTION
  2. UPDATE 現金出納テーブル SET 収入=収入+1000 WHERE 会計月=12
  3. UPDATE 給料テーブル SET 支給額=支給額+1000 WHERE 会計月=12
  4. ROLLBACK

トランザクションを利用する場合の注意

トランザクションを利用する場合、途中で実行されるクエリーのエラー・チェックをしっかり行う必要があります。

クエリーがエラーになったらROLLBACKして、そのトランザクションの最初から再実行するような仕組みを組み込む必要があります。 エラーのまま、トランザクションを続けるようなことをやってはいけません。

Copyright©2001-2021 釣ったよ! All Right Reserved.    sg@tsuttayo.jpn.org