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

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ SQL の使用法 » トランザクションと独立性レベル » 独立性レベルのチュートリアル » チュートリアル:幻ローの知識

 

レッスン 2:スナップショットアイソレーションを使用して幻ローを防ぐ

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

前提条件

このレッスンは、受講者がこれまでのすべてのレッスンを終了していることを前提としています。レッスン 1:幻ローの作成を参照してください。

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:幻ローの知識

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

    SET OPTION PUBLIC. allow_snapshot_isolation = 'On';
    SET TEMPORARY OPTION isolation_level = 'snapshot';
  2. 次の文を実行して、すべての部署をリストします。

    SELECT * FROM GROUPO.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 を新しい部署の責任者にします。Sales Manager として、次の文を実行し、新しい部署用のエントリを作成します。この新しいエントリは、Sales Manager のウィンドウのテーブル下部に新しいローとして表示されます。

    INSERT INTO GROUPO.Departments
       ( DepartmentID, DepartmentName, DepartmentHeadID )
       VALUES( 600, 'Foreign Sales', 129 );
    COMMIT;
  4. Sales Manager として次の文を実行し、すべての部署のリストを表示します。

    SELECT * FROM GROUPO.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
  5. Accountant はクエリをもう一度実行できます。また、トランザクションがコミットされていないため、新しいローを認識しません。

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

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

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

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

    COMMIT;
       SELECT * FROM GROUPO.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
  8. SQL Anywhere サンプルデータベースが変更されないようにするため、Major Account Sales 部署のローを挿入する未完了トランザクションをロールバックし、2 つ目のトランザクションを使用して Foreign Sales 部署を削除してください。

    1. Sales Manager として、次の文を実行して現在のトランザクションをロールバックし、以前挿入されたローを削除し、この操作をコミットします。

      ROLLBACK;
      DELETE FROM GROUPO.Departments
      WHERE DepartmentID = 600;
      COMMIT;

結果

スナップショットアイソレーションを使用して、幻ローを防ぐことができました。