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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » トランザクションと独立性レベル » 独立性レベルと一貫性 » スナップショットアイソレーション

 

スナップショットアイソレーションの例

次の例では、SQL Anywhere サンプルデータベースへの接続 2 つを使用し、スナップショットアイソレーションによってブロックなしで一貫性を維持する方法を示します。

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

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

    dbisql -c "DSN=SQL Anywhere 12 Demo;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;
 参照