Sales Manager によって変更され、同じトランザクション中に 2 つの異なる結果を取得するローを Accountant が読み出す、繰り返し不可能読み出しを作成します。
前提条件
このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:繰り返し不可能読み出しの知識
次の文を実行して、Accountant の接続の独立性レベルを 1 に設定します。
SET TEMPORARY OPTION isolation_level = 1; |
次の文を実行して、Sales Manager のウィンドウに独立性レベル 1 を設定します。
SET TEMPORARY OPTION isolation_level = 1; |
Accountant として、次の文を実行し、サンバイザーの価格のリストを表示します。
SELECT ID, Name, UnitPrice FROM GROUPO.Products; |
ID | Name | UnitPrice |
---|---|---|
300 | Tee Shirt | 9.00 |
301 | Tee Shirt | 14.00 |
302 | Tee Shirt | 14.00 |
400 | Baseball Cap | 9.00 |
401 | Baseball Cap | 10.00 |
500 | Visor | 7.00 |
501 | Visor | 7.00 |
... | ... | ... |
Sales Manager として、次の文を実行し、プラスチック製サンバイザーの新しい販売価格を導入します。
SELECT ID, Name, UnitPrice FROM GROUPO.Products WHERE Name = 'Visor'; UPDATE GROUPO.Products SET UnitPrice = 5.95 WHERE ID = 501; COMMIT; SELECT ID, Name, UnitPrice FROM GROUPO.Products WHERE Name = 'Visor'; |
ID | Name | UnitPrice |
---|---|---|
500 | Visor | 7.00 |
501 | Visor | 5.95 |
Sales Manager ウィンドウでのバイザーの価格と Accountant ウィンドウでの価格を比較してみてください。Accountant として SELECT 文をもう一度実行すると、Sales Manager の新価格が表示されます。
SELECT ID, Name, UnitPrice FROM GROUPO.Products; |
ID | Name | UnitPrice |
---|---|---|
300 | Tee Shirt | 9.00 |
301 | Tee Shirt | 14.00 |
302 | Tee Shirt | 14.00 |
400 | Baseball Cap | 9.00 |
401 | Baseball Cap | 10.00 |
500 | Visor | 7.00 |
501 | Visor | 5.95 |
... | ... | ... |
この矛盾を「「繰り返し不可能読み出し」」と呼んでいます。Accountant が 2 回目も同じトランザクションで同じ SELECT 文を実行した後で、同じ結果が得られないためです。
もちろん、Accountant が SELECT を再度使用する前に、COMMIT や ROLLBACK 文などを発行してトランザクションを終了した場合には、状況は違ってきます。データベースは複数のユーザが同時に使用でき、Accountant のトランザクションの前後に他の人が値を変更できます。他の人が行った変更によって矛盾が生じるのは、Accountant のトランザクションの途中で変更が行われるためです。そうしたイベントにより、スケジュールは直列化不可能となります。
Accountant はこれに気づき、以降は価格参照中にほかからの変更を防ぐことにします。繰り返し不可読み出しは、独立性レベル 2 で削除されます。Accountant として、次の文を実行します。
SET TEMPORARY OPTION isolation_level = 2; SELECT ID, Name, UnitPrice FROM GROUPO.Products; |
Sales Manager は、明日受注するはずの大口注文に値下げを適用しなくて済むように、プラスチックバイザーの安売りを来週に延期することを決定します。Sales Manager として、次の文を実行します。文の実行が始まりますが、ウィンドウは実行中のまま終了しません。
UPDATE GROUPO.Products SET UnitPrice = 7.00 WHERE ID = 501; |
データベースサーバは独立性レベル 2 では繰り返し可能読み出しを保証する必要があります。Accountant は独立性レベル 2 を使用するため、データベースサーバは Accountant が読み込む Products テーブルの各ローに読み込みロックをかけます。Sales Manager が価格を元に戻そうとすると、そのトランザクションは、Products テーブルのプラスチックバイザーのローに書き込みロックをかける必要があります。書き込みロックは排他ロックであるため、Accountant のトランザクションが読み込みロックを解放するまで待機しなければなりません。
Accountant が価格の閲覧を終了しました。データベースを誤って変更するのを防ぐために、ROLLBACK 文でトランザクションを完了します。
ROLLBACK; |
データベースサーバがこの文を実行すると、Sales Manager のトランザクションが完了します。
ID | Name | UnitPrice |
---|---|---|
500 | Visor | 7.00 |
501 | Visor | 7.00 |
Sales Manager もトランザクションを終了できるようになりました。Sales Manager は、変更をコミットして、元の価格をリストアします。
COMMIT; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |