|
COMMIT ステートメントにより、論理トランザクションの終了を示し、テンポラリ データをパーマネント データに変換します。
COMMIT(および START TRANSACTION)はストアド プロシージャ内でのみサポートされます。SQL Editor では、COMMIT および START TRANSACTION は使用できません(SQL Editor は AUTOCOMMIT をオンに設定します)。
ストアド プロシージャ内でコミットされたステートメントは、呼び出し元の ODBC アプリケーションの一番外側のトランザクションによって制御されます。これはつまり、SQLSetConnectOption で指定された AUTOCOMMIT モードに従って、ODBC アプリケーションから外部的に呼び出しているストアド プロシージャが、2 種類ある動作のうち 1 つを実行するということです。自動的にコミットする(AUTOCOMMIT がオン、デフォルト)か、SQLTransact が SQL_COMMIT または SQL_ROLLBACK で呼び出されるのを待つ(AUTOCOMMIT がオフに設定されている場合)のいずれかです。
START TRANSACTION ステートメントを 2 回以上実行してネストされたトランザクションを開始することはできますが、ネストされたコミット ブロックをコミットするかロール バックするかを制御するのは、一番外側の COMMIT です。たとえば、トランザクションが 5 レベルまでネストされている場合、すべてのトランザクションをコミットするには 5 つの COMMIT ステートメントが必要になります。COMMIT は、一番外側のトランザクションがコミットされるまでロックを解除しません。
COMMIT と COMMIT WORK の機能は同じです。
次の例では、ストアド プロシージャの中で、Billing テーブル内の Amount_Owed 列を更新するトランザクションが開始されます。この作業がコミットされると、別のトランザクションによって Amount_Paid 列が更新されてゼロに設定されます。最後の COMMIT WORK ステートメントにより、2 番目のトランザクションが終了します。
START TRANSACTION; UPDATE Billing B SET Amount_Owed = Amount_Owed - Amount_Paid WHERE Student_ID IN (SELECT DISTINCT E.Student_ID FROM Enrolls E, Billing B WHERE E.Student_ID = B.Student_ID); COMMIT WORK; START TRANSACTION; UPDATE Billing B SET Amount_Paid = 0 WHERE Student_ID IN (SELECT DISTINCT E.Student_ID FROM Enrolls E, Billing B WHERE E.Student_ID = B.Student_ID); COMMIT WORK;
CREATE PROCEDURE UpdateBilling( ) AS BEGIN START TRANSACTION; UPDATE Billing SET Amount_Owed = Amount_Owed + Amount_Owed; UPDATE Billing set Amount_Owed = Amount_Owed + 100 WHERE Student_ID = 10; COMMIT; END;
|