SQL Serverでは、3つの命令でトランザクションを管理できます。
- 3つの命令 -
トランザクション管理が問題になるのは、データベースを書き換える処理──INSERT、UPDATE、DELETEなどのSQL命令──を行ったときです。こういったSQLを発行すると、データベース・エンジンは1つの処理を1つのトランザクションとして管理し、それが終了して内容が確定されるまで、同じテーブルまたはレコードに対して他の処理を行えないようにします。
トランザクションの管理には、以下の3つの命令が用いられます※3。
BEGIN TRANSACTION:明示的なトランザクションの開始。BEGIN TARNと略せる。
COMMIT TRANSACTION:トランザクションの確定(内容が書き換えられる)。COMMITと略せる。
ROLLBACK TRANSACTION:トランザクションの取り消し(内容は書き換えられない)。ROLLBACKと略せる。
※3 トランザクションの管理はデータベース・エンジンに固有の機能なので、DBMSによって命令語やその仕様は異なります。Oracleではトランザクションの開始にSET TRANSACTION、確定にCOMMIT、取り消しにROLLBACKという命令を使います
- 自動的なトランザクション管理 -
SQL Serverでは、トランザクション管理は自動的に行われます。つまり、UPDATEなどのSQL命令を受け取ると自動的に対象となるレコードまたはテーブルがロックされ、処理を終えると自動的に変更内容が確定してロックが解除されます。
大抵の処理は、この自動トランザクション管理に任せて大丈夫です。しかし、それだけでは十分ではありません。明示的にトランザクションを管理すべき場合も少なからずあります。
なぜなら、自動的なトランザクションでは、処理が必ず確定(コミット:COMMIT)されてしまうからです。トランザクション管理で重要な機能は、一旦発行した一連の命令をすべて「なかったこと」にできるロールバック(ROLLBACK)です。
明示的なトランザクション管理を行えば、競合やエラーでデータベースが正しく(意図通りに)更新されなかった場合には処理を取り消し、正しい順序に組み替えた上でやり直すことも可能になります。
- トランザクションの開始~BEGIN TRANSACTION -
トランザクションの管理を明示的に開始し、トランザクションが完了するまで(COMMIT TRANSACTION命令またはROLLBACK TRANSACTION命令が発行されるまで)、これに続くSQL命令で書き換えの対象となるリソース(テーブルやレコード)をロックします。
BEGIN TRANSACTION命令を発行すると、トランザクションの開始位置が内部的に記録されます。
この後にデータベースを書き換える命令を発行し、最後にCOMMIT TRANSACTION命令を実行すると、BEGIN TRANSACTION以降の処理がすべて確定されます。ROLLBACK TRANSACTION命令を発行すれば、記録された開始位置からROLLBACK TRANSACTION命令の発行直前までの処理が取り消されます。
- トランザクションの確定~COMMIT TRANSACTION -
BEGIN TRANSACTION命令以降に発行されたSQLの処理を実際に行って処理を確定し、ロックされていたリソースを解放します。
この命令を発行すると、BEGIN TRANSACTION~COMMIT TRANSACTION間に記述されたすべての命令による変更が確定します。従って、SQL文が正常に実行されることを確認した上でCOMMIT TRANSACTIONを発行しなければなりません。
実行時にエラーが発生した場合は、COMMIT TRANSACTIONの代わりにROLLBACK TRANSACTION命令で処理を取り消す必要があります。
- トランザクションの取り消し~ROLLBACK TRANSACTION -
BEGIN TRANSACTION命令以降に発行されたSQLの処理をすべて取り消してBEGIN TRANSACTION命令直前の状態に戻し、ロックされていたリソースを解放します。
BEGIN TRANSACTIONを1回発行した後は、COMMIT TRANSACTIONまたはROLLBACK TRANSACTIONのどちらかを発行してトランザクションを完了させます。
COMMIT TRANSACTIONの後でROLLBACK TRANSACTIONを実行しても、その間の処理は取り消せません。同様に、ROLLBACK TRANSACTIONの後からCOMMIT TRANSACTIONを発行しても処理を確定することはできません。
|
|
|