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

 

レッスン 1:幻ローの作成

 ♦ 幻ローの作成
  1. Interactive SQL の 2 つのインスタンスを起動します。チュートリアル:繰り返し不可能読み出しの知識の手順 1 ~ 4 を参照してください。

  2. 次の文を実行して、Sales Manager のウィンドウに独立性レベル 2 を設定します。

    SET TEMPORARY OPTION isolation_level = 2;
  3. 次の文を実行して、Accountant のウィンドウに独立性レベル 2 を設定します。

    SET TEMPORARY OPTION isolation_level = 2;
  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 は外国市場に焦点を当てた新しい部署を設定することを決めます。EmployeeID 129 の Philip Chin を新しい部署の責任者にします。

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

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

    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
  6. しかし Accountant は、新しい部署が作成されたことに気づきません。独立性レベル 2 で、データベースサーバーはローを変更しないようにロックをかけますが、他のトランザクションが新しいローを挿入するのを防止するロックはかけていません。

    Accountant は SELECT 文を再実行した場合にだけ、新しいローを発見できます。Accountant のウィンドウで SELECT 文を再実行してください。テーブルに新しいローが追加されているのがわかります。

    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

    新しく追加されたローは、「幻ロー」と呼ばれます。これは、Accountant の観点から見ると、このローがどこからともなく出現した幻のように映るためです。Accountant は独立性レベル 2 で接続されます。このレベルでは、サーバーは使用中のローにだけロックをかけます。他のローにはロックがかけられないため、Sales Manager が新しいローを挿入するのを妨げるものはありません。

  7. Accountant は今後そうしたことが起こらないように、現在のトランザクションの独立性レベルを 3 に上げることにします。次の文を Accountant として入力します。

    SET TEMPORARY OPTION isolation_level = 3;
    SELECT *
    FROM Departments
    ORDER BY DepartmentID;
  8. Sales Manager は、大企業を対象にした営業活動を行う新たな部署を追加したいと思っています。Sales Manager のウィンドウで次の文を実行します。

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

    Accountant のロックが文をブロックするため、Sales Manager のウィンドウは実行中に一時停止します。ツールバーの [停止] をクリック (または [SQL]  » [停止] をクリック) してこのエントリを一時停止します。

  9. SQL Anywhere サンプルデータベースが変更されないようにするため、Major Account Sales 部署のローを挿入する未完了トランザクションをロールバックし、2 つ目のトランザクションを使用して Foreign Sales 部署を削除してください。

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

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

      DELETE FROM Departments
      WHERE DepartmentID = 600;
      COMMIT;
 説明
 参照