START TRANSACTION
START TRANSACTION は、論理トランザクションの開始を知らせるものであり、常に、COMMIT または ROLLBACK と組み合わせて使用する必要があります。
構文
START TRANSACTION
SQL ステートメント
COMMIT | ROLLBACK [WORK]
備考
START TRANSACTION はストアド プロシージャ内でのみサポートされます。SQL Editor では START TRANSACTION を使用できません(SQL Editor は AUTOCOMMIT をオンに設定します)。
このステートメントはストアド プロシージャ外ではサポートされません。これは、ODBC 標準が、すべてのステートメントはデフォルトでトランザクション内にあることを条件としているためです。ODBC 標準にはトランザクションを開始する API がありません。
ODBC は、各 SQL ステートメントを SQL 独自のトランザクション内に置くか、それともアプリケーションが各トランザクションの終了時を指定するかどうかを決定するアプリケーションを提供します。ODBC は、トランザクション内にないどのステートメントより前に、自動的にトランザクションを開きます。したがって、指定された接続の最初のステートメント、あるいは COMMIT または ROLLBACK 後の最初のステートメントにより、ODBC は自動的に新しいトランザクションを開始します。
ODBC 標準内では、SQLSetConnectOption を使って、各ステートメントを独自のトランザクション内に置くか、またはアプリケーションが複数のステートメントを 1 つのトランザクションにまとめるかどうかを指定します。
SQLSetConnectOption にオプション SQL_AUTOCOMMIT、値 SQL_AUTOCOMMIT_ON(これがデフォルトです)を指定して呼び出すと、各ステートメントは独自のトランザクション内に置かれます。このように使用すると、トランザクションはステートメントの実行を開始するときに開始され、ステートメントの実行の完了時点でエラーが発生していない場合は自動的にコミットされ、エラーが発生した場合はロール バックされるようになります。
SQLSetConnectOption にオプション SQL_AUTOCOMMIT、値 SQL_AUTOCOMMIT_OFF を指定して呼び出すと、アプリケーションがステートメントを 1 つのトランザクションにまとめることができます。このように使用すると、トランザクションは実行される最初のステートメントを開始するときに開始されます。その後、トランザクションをいつ、どのように終了するかは、アプリケーションが SQLTransact を呼び出すか、'COMMIT WORK' または 'ROLLBACK WORK' ステートメントを実行するかによって決まります。アプリケーションが 1 つのトランザクションを終了すると、次のステートメントの実行時に別のトランザクションが自動的に開始されます。
例
次の例では、ストアド プロシージャの中で、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;
関連項目