![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
|
最初にことわっておきますが、私はMySQLしか詳しくわかりません。ですから、トランザクションについての一般的説明はできません。ここではMySQLに限っての説明です。 また、ここではinnoDBでのトランザクションについて書きます。 トランザクションとはトランザクションとは、一連のデータベース操作をひとかたまりとして、まためて実行できる機能です。また、付随機能として、更新の中断機能(これをロールバックという)があります。 トランザクションの例たとえば、次のクエリーを順番に実行した場合の動作で考えてみます。 これは「おこずかい帳」というデータベースで、給料を1000円もらったときに、2つのテーブルを更新する場合の例です。
MyISAMであれば、1行ずつ実行されますから、わかりきったクエリーです。 しかし、このようなクエリーを実行すると、「現金出納テーブル」の更新が完了し、「給料テーブル」の更新は完了していないという状態が一瞬かもしれませんが発生します。 おこずかい帳程度であれば、これはほとんど問題がないのですが、複数ユーザーが同時に利用する会計処理などではたいへん困ったことになります。ある時点での収入額は、テーブルによって不一致が発生する危険性がたいへん高いです。 そこで、このような「一連の更新」をひとまとめにしてやってしまおうというのがトランザクションです。 innoDBテーブルで次のクエリーを実行すると、「COMMIT」時に一括更新されるようになります。
また、行レベル・ロックが自動的に適用されるため、他のクライアントから見ると、いつも必ず「現金出納テーブル」と「給料テーブル」のデータ整合性は取れているということになります。 参考程度に、MyISAMで同様のクエリーを実行する場合、次のようにする必要があります。テーブル自体をロックしてしまっています。
ロールバックトランザクション実行中に、何らかの理由で途中までの更新クエリーを廃棄してしまうことが可能です。以下の例では「ROLLBACK」によって更新クエリーをすべて廃棄しています。
トランザクションを利用する場合の注意トランザクションを利用する場合、途中で実行されるクエリーのエラー・チェックをしっかり行う必要があります。 クエリーがエラーになったらROLLBACKして、そのトランザクションの最初から再実行するような仕組みを組み込む必要があります。 エラーのまま、トランザクションを続けるようなことをやってはいけません。 |
| Copyright©2001-2008 釣ったよ! All Right Reserved. sg@tsuttayo.sytes.net |