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 の使用法 » トランザクションと独立性レベル » 独立性レベルのチュートリアル » チュートリアル:幻ローの知識

 

レッスン 2:幻ローの回避

 ♦ スナップショットアイソレーションを使用した幻ローの回避

snapshot 独立性レベルを使用すると、独立性レベル 3 と同じレベルで一貫性を維持することができ、ブロックが発生しません。Sales Manager の文はブロックされず、Accountant は幻ローを認識しません。

まだ実行していない場合は、幻ローのチュートリアルの手順 1 ~ 4 を実行してください。Interactive SQL が 2 つ起動されます。チュートリアル:幻ローの知識を参照してください。

  1. 次の文を実行し、Accountant のスナップショットアイソレーションを有効にします。

    SET OPTION PUBLIC. allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  2. Accountant のウィンドウに次の文を入力し、すべての部署をリストします。

    SELECT * FROM Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
  3. Sales Manager は外国市場に焦点を当てた新しい部署を設定することを決めます。EmployeeID 129 の Philip Chin を新しい部署の責任者にします。

    INSERT INTO Departments
       ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 600, 'Foreign Sales', 129 );
    COMMIT;

    最後の文は新しい部署に新しいエントリを作成します。このエントリは、Sales Manager のウィンドウのテーブルの一番下に新しいローとして表示されます。

    SELECT * FROM Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129
  4. Accountant はクエリをもう一度実行できます。また、トランザクションが終了していないため、新しいローを認識しません。

    SELECT *
    FROM Departments
    ORDER BY DepartmentID;
    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
  5. Sales Manager は、大企業を対象にした営業活動を行う新たな部署を追加したいと思っています。Sales Manager のウィンドウで次の文を実行します。

    INSERT INTO Departments
     ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 700, 'Major Account Sales', 902 );

    Accountant がスナップショットアイソレーションを使用しているため、Sales Manager による変更はブロックされません。

  6. Sales Manager がデータベースにコミットした変更を認識するために、Accountant はスナップショットアイソレーションを終了する必要があります。

    COMMIT;
       SELECT * FROM Departments
       ORDER BY DepartmentID;

    Accountant は Foreign Sales 部署を認識するようになりました。ただし、Major Account Sales 部署は認識しません。

    DepartmentID DepartmentName DepartmentHeadID
    100 R & D 501
    200 Sales 902
    300 Finance 1293
    400 Marketing 1576
    500 Shipping 703
    600 Foreign Sales 129
  7. SQL Anywhere サンプルデータベースが変更されないようにするため、Major Account Sales 部署のローを挿入する未完了トランザクションをロールバックし、2 つ目のトランザクションを使用して Foreign Sales 部署を削除してください。

    1. Sales Manager のウィンドウで次の文を実行し、最後の未完了トランザクションをロールバックします。

      ROLLBACK;
    2. Sales Manager のウィンドウで次の 2 つの文を実行し、先に挿入したローを削除し、この操作をコミットします。

      DELETE FROM Departments
      WHERE DepartmentID = 600;
      COMMIT;