Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » トランザクションと独立性レベルの使用

 

トランザクションの使用

SQL Anywhere では、コマンドはトランザクションにまとめます。トランザクションをコミットすると、データベースの変更が永続的なものになります。データを変更すると、変更がトランザクション・ログに記録されます。変更は、COMMIT コマンドを入力するまでは永続的なものにはなりません。

トランザクションは次のいずれかのイベントで開始します。

  • データベースへの接続後、最初の文

  • トランザクションの終了後、最初の文

トランザクションは次のいずれかのイベントで完了します。

  • データベースの変更を確定する COMMIT 文

  • トランザクションで行われたすべての変更を取り消す ROLLBACK 文

  • オートコミットが実行される文。データ定義コマンドの ALTER、CREATE、COMMENT、DROP はすべて自動的にコミットを実行します。

  • データベースへの接続を解除すると、暗黙的なロールバックが実行されます。

  • ODBC と JDBC には各文の後で COMMIT 文を実行するオートコミットの設定があります。デフォルトでは、ODBC と JDBC のオートコミットの設定は ON にする必要があり、各文は単一のトランザクションとして処理されます。トランザクション設計機能を活用する場合は、オートコミットの設定を off にします。

    オートコミットの詳細については、オートコミットまたは手動コミット・モードの設定を参照してください。

  • chained データベース・オプションを Off にしておくと、各文の後にオートコミットを実行したのと同様の処理が行われます。デフォルトでは、jConnect または Open Client アプリケーションを使用する接続では chained は Off に設定されています。

    詳細については、オートコミットまたは手動コミット・モードの設定chained オプション [互換性]を参照してください。

Interactive SQL のオプション

Interactive SQL は、いつ、どのようにトランザクションを終了するかを指定する次の 2 つのオプションを提供します。

  • auto_commit オプションを On に設定すると、Interactive SQL では、文が正常に実行された場合は結果が自動的にコミットされ、失敗した場合は ROLLBACK が自動的に実行されます。auto_commit オプション [Interactive SQL]を参照してください。

  • commit_on_exit オプションは、Interactive SQL を終了したときにコミットされていない変更をどうするかを決定します。このオプションを On (デフォルト) に設定すると、Interactive SQL は COMMIT を実行し、それ以外の場合はコミットされていない変更を ROLLBACK 文で取り消します。commit_on_exit オプション [Interactive SQL]を参照してください。

Interactive SQL でのデータ・ソースの使用

デフォルトでは、ODBC はオートコミット・モードで動作します。Interactive SQL で auto_commit オプションを Off に設定しても、Interactive SQL の設定は ODBC の設定によって上書きされます。ODBC の設定は、SQL_ATTR_AUTOCOMMIT 接続属性を使用して変更できます。ODBC オートコミットは chained オプションから独立しています。

SQL Anywhere も、BEGIN TRANSACTION などの Transact-SQL コマンドをサポートし、Sybase Adaptive Server Enterprise との互換性を保ちます。詳細については、Transact-SQL との互換性を参照してください。

トランザクションの開始タイミングの決定

TransactionStartTime データベース・プロパティは、COMMIT または ROLLBACK の後にデータベースが最初に修正された時間を返します。このプロパティを使用すると、すべてのアクティブな接続で最も早いトランザクションの開始時刻を調べることができます。次に例を示します。

BEGIN
  DECLARE connid int;
  DECLARE earliest char(50);
  DECLARE connstart char(50);
  SET connid=next_connection(null);
  SET earliest = NULL;
  lp: LOOP
  IF connid IS NULL THEN LEAVE lp END IF;
    SET connstart = CONNECTION_PROPERTY('TransactionStartTime',connid);
    IF connstart <> '' THEN
      IF earliest IS NULL 
      OR CAST(connstart AS TIMESTAMP) < CAST(earliest AS TIMESTAMP) THEN
        SET earliest = connstart;
      END IF;
    END IF;
    SET connid=next_connection(connid);
  END LOOP;
  SELECT earliest
END