Interactive SQL を起動します。
[接続] ウィンドウで、Sales Manager として SQL Anywhere サンプルデータベースに接続します。
[アクション] ドロップダウンリストで、[ODBC データソースを使用した接続] をクリックします。
[ODBC データソース名] をクリックし、その下のフィールドに SQL Anywhere 12 Demo と入力します。
必要に応じて、[詳細] をクリックし、[詳細オプション] タブを表示します。
[詳細オプション] タブをクリックし、[ConnectionName] フィールドに Sales Manager と入力します。
[接続] をクリックします。
Interactive SQL をもう 1 つ起動します。
[接続] ウィンドウで、Accountant として SQL Anywhere サンプルデータベースに接続します。
[アクション] ドロップダウンリストで、[ODBC データソースを使用した接続] をクリックします。
[ODBC データソース名] をクリックし、その下のフィールドに SQL Anywhere 12 Demo と入力します。
必要に応じて、[詳細] をクリックし、[詳細オプション] タブを表示します。
[詳細オプション] タブをクリックし、[ConnectionName] フィールドに Accountant と入力します。
[接続] をクリックします。
次の文を実行して、Accountant の接続の独立性レベルを 1 に設定します。
SET TEMPORARY OPTION isolation_level = 1; |
次の文を実行して、Sales Manager のウィンドウに独立性レベル 1 を設定します。
SET TEMPORARY OPTION isolation_level = 1; |
Accountant は、バイザーの価格をリストすることにします。Accountant として、次の文を実行します。
SELECT ID, Name, UnitPrice FROM 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 は、プラスチックバイザーに新価格を導入することにします。Sales Manager として、次の文を実行します。
SELECT ID, Name, UnitPrice FROM Products WHERE Name = 'Visor'; UPDATE Products SET UnitPrice = 5.95 WHERE ID = 501; COMMIT; SELECT ID, Name, UnitPrice FROM 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 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 Products; |
Sales Manager は、明日受注するはずの大口注文に値下げを適用しなくて済むように、プラスチックバイザーの安売りを来週に延期することを決定します。Sales Manager のウィンドウで、次の文を実行します。文の実行が始まりますが、ウィンドウは実行中のまま終了しません。
UPDATE 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 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |