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 サンプル・データベースへの接続 2 つを使用し、スナップショット・アイソレーションによってブロックなしで一貫性を維持する方法を示します。

♦  スナップショット・アイソレーションを使用するには、次の手順に従います。
  1. 次のコマンドを実行して、SQL Anywhere サンプル・データベースへの Interactive SQL 接続 (Connection1) を作成します。

    dbisql -c "DSN=SQL Anywhere 11 Demo;UID=DBA;PWD=sql;ConnectionName=Connection1"
  2. 次のコマンドを実行して、SQL Anywhere サンプル・データベースへの Interactive SQL 接続 (Connection2) を作成します。

    dbisql -c "DSN=SQL Anywhere 11 Demo;UID=DBA;PWD=sql;ConnectionName=Connection2"
  3. Connection1 で、次のコマンドを実行し、独立性レベルを 1 (コミットされた読み出し) に設定します。レベル 1 では、現在のローで読み込みロックを取得して設定します。

    SET OPTION isolation_level = 1;
  4. Connection1 で、次のコマンドを実行します。

    SELECT * FROM Products;
    ID Name Description Size Color Quantity ...
    300 Tee Shirt Tank Top Small White 28 ...
    301 Tee Shirt V-neck Medium Orange 54 ...
    302 Tee Shirt Crew Neck One size fits all Black 75 ...
    400 Baseball Cap Cotton Cap One size fits all Black 112 ...
    ... ... ... ... ... ... ...
  5. Connection2 で、次のコマンドを実行します。

    UPDATE Products
    SET Name = 'New Tee Shirt'
    WHERE ID = 302;
  6. Connection1 で、もう一度 SELECT 文を実行します。

    SELECT * FROM Products;

    Connection2 の UPDATE 文がコミットされていないかロールバックされていないため、この SELECT 文はブロックされて処理できません。SELECT 文は、Connection2 のトランザクションが完了して処理できるようになるまで待機する必要があります。これにより、SELECT 文はコミットされていないデータを結果に読み込みません。

  7. Connection2 で、次のコマンドを実行します。

    ROLLBACK;

    Connection2 のトランザクションが完了し、Connection1 の SELECT 文が処理されます。

  8. 独立性レベル statement snapshot を使用することで、ブロックなしで独立性レベル 1 と同じ同時実行性を実現します。

    Connection1 で、次のコマンドを実行してスナップショット・アイソレーションを許可します。

    SET OPTION PUBLIC.allow_snapshot_isolation = 'On';
  9. Connection1 で、次のコマンドを実行し、独立性レベル を statement snapshot に変更します。

    SET TEMPORARY OPTION isolation_level = 'statement-snapshot';
  10. Connection1 で、次の文を実行します。

    SELECT * FROM Products;
  11. Connection2 で、次の文を実行します。

    UPDATE Products
    SET Name = 'New Tee Shirt'
    WHERE ID = 302;
  12. Connection1 で、もう一度 SELECT 文を実行します。

    SELECT * FROM Products;

    SELECT 文は、ブロックされずに実行されますが、Connection2 によって実行された UPDATE 文からのデータは含まれません。

  13. Connection2 で、次のコマンドを実行してトランザクションを終了します。

    COMMIT;
  14. Connection1 で、トランザクション (Products テーブルに対するクエリ) を終了し、もう一度 SELECT 文を実行して更新されたデータを確認します。

    COMMIT;
    SELECT * FROM Products;
    ID Name Description Size Color Quantity ...
    300 Tee Shirt Tank Top Small White 28 ...
    301 Tee Shirt V-neck Medium Orange 54 ...
    302 New Tee Shirt Crew Neck One size fits all Black 75 ...
    400 Baseball Cap Cotton Cap One size fits all Black 112 ...
    ... ... ... ... ... ... ...
  15. 次の文を実行し、SQL Anywhere サンプル・データベースに対する変更を取り消します。

    UPDATE Products
    SET Name = 'Tee Shirt'
    WHERE id = 302;
    COMMIT;

スナップショット・アイソレーションの使用方法の例の詳細については、次の項を参照してください。