トランザクション
Autocommit
デフォルトでは、ODBC 接続は自動コミットモードで開始します。個々のSQL ステートメントは、 ステートメントの完了時にコミットされる独自のトランザクション内で実行されます。
明示的なトランザクションは、 SQLSetConnectAttr を使って自動コミットを無効にすることで使用できます。このモードでは、 SQL ステートメントが暗黙のうちにトランザクションを開始し、トランザクションがコミットまたはロールバックされるまで実行されます。コミットまたはロールバックの後、別のトランザクションが自動的に作成されます。
一度にアクティブにできるトランザクションは1つのみです。トランザクションは、
どのステートメントハンドルから実行されるかに関わらず、接続で実行されるすべてのステートメントに適用されます。
SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; // This creates a new transaction for the next group of SQL statements SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) 1, 0); // Both of these statements execute in the same transaction SQLExecDirect(hstmt, "INSERT INTO ExampleTable (ExampleCol) VALUES ('ExampleVal1')", SQL_NTS); SQLExecDirect(hstmt, "INSERT INTO ExampleTable (ExampleCol) VALUES ('ExampleVal2')", SQL_NTS); // This ends the current transaction and begins a new one for the next groupp of statements SQLEndTran(SQL_HANDLE_DBC, hdbc, ...);
トランザクションのコミットとロールバック
自動コミットを無効にすると、
アクティブなトランザクションは、SQLEndTran を使用してコミットまたはロールバックすることができます。コミットはトランザクション内のすべての変更を受け入れ、その変更が一貫している場合受け入れを永続化します。
SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
ロールバックするとトランザクションで実行されたすべての変更が取り消されます。
SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_ROLLBACK);