次の例では、SQL Anywhere サンプルデータベースへの接続 2 つを使用し、スナップショットアイソレーションによってブロックなしで一貫性を維持する方法を示します。
次のコマンドを実行して、SQL Anywhere サンプルデータベースへの Interactive SQL 接続 (Connection1) を作成します。
dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection1" |
次のコマンドを実行して、SQL Anywhere サンプルデータベースへの Interactive SQL 接続 (Connection2) を作成します。
dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection2" |
Connection1 で、次の文を実行し、独立性レベルを 1 (コミットされた読み出し) に設定します。レベル 1 では、現在のローで読み込みロックを取得して設定します。
SET OPTION isolation_level = 1; |
Connection1 で、次の文を実行します。
SELECT * FROM Products; |
ID | Name | Description | Size | Color | Quantity | ... |
---|---|---|---|---|---|---|
300 | Tee Shirt | Tank Top | Small | White | 28 | ... |
301 | Tee Shirt | V-neck | Medium | Orange | 54 | ... |
302 | Tee Shirt | Crew Neck | One size fits all | Black | 75 | ... |
400 | Baseball Cap | Cotton Cap | One size fits all | Black | 112 | ... |
... | ... | ... | ... | ... | ... | ... |
Connection2 で、次の文を実行します。
UPDATE Products SET Name = 'New Tee Shirt' WHERE ID = 302; |
Connection1 で、もう一度 SELECT 文を実行します。
SELECT * FROM Products; |
Connection2 の UPDATE 文がコミットされていないかロールバックされていないため、この SELECT 文はブロックされて処理できません。SELECT 文は、Connection2 のトランザクションが完了して処理できるようになるまで待機する必要があります。これにより、SELECT 文はコミットされていないデータを結果に読み込みません。
Connection2 で、次の文を実行します。
ROLLBACK; |
Connection2 のトランザクションが完了し、Connection1 の SELECT 文が処理されます。
独立性レベル statement snapshot を使用することで、ブロックなしで独立性レベル 1 と同じ同時実行性を実現します。
Connection1 で、次の文を実行してスナップショットアイソレーションを許可します。
SET OPTION PUBLIC.allow_snapshot_isolation = 'On'; |
Connection1 で、次の文を実行し、独立性レベル を statement snapshot に変更します。
SET TEMPORARY OPTION isolation_level = 'statement-snapshot'; |
Connection1 で、次の文を実行します。
SELECT * FROM Products; |
Connection2 で、次の文を実行します。
UPDATE Products SET Name = 'New Tee Shirt' WHERE ID = 302; |
Connection1 で、もう一度 SELECT 文を実行します。
SELECT * FROM Products; |
SELECT 文は、ブロックされずに実行されますが、Connection2 によって実行された UPDATE 文からのデータは含まれません。
Connection2 で、次の文を実行してトランザクションを終了します。
COMMIT; |
Connection1 で、トランザクション (Products テーブルに対するクエリ) を終了し、もう一度 SELECT 文を実行して更新されたデータを確認します。
COMMIT; SELECT * FROM Products; |
ID | Name | Description | Size | Color | Quantity | ... |
---|---|---|---|---|---|---|
300 | Tee Shirt | Tank Top | Small | White | 28 | ... |
301 | Tee Shirt | V-neck | Medium | Orange | 54 | ... |
302 | New Tee Shirt | Crew Neck | One size fits all | Black | 75 | ... |
400 | Baseball Cap | Cotton Cap | One size fits all | Black | 112 | ... |
... | ... | ... | ... | ... | ... | ... |
次の文を実行し、SQL Anywhere サンプルデータベースに対する変更を取り消します。
UPDATE Products SET Name = 'Tee Shirt' WHERE id = 302; COMMIT; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |