■例題2
読み取り一貫性について正しく説明しているものを、次の中からすべて選択してください。
a.読み取り一貫性とは、トランザクション実行中はほかのトランザクションからアクセスさせない機能である
b.ユーザーAが「10」の値を「20」にUPDATEしたとき、ユーザーBがそのデータをSELECTすると、戻ってくる値は「20」である
c.ユーザーAが「10」の値を「20」にUPDATEしたとき、ユーザーBがそのデータをSELECTすると、戻ってくる値は「10」である
d.あるトランザクションで変更した確定前のデータをほかのトランザクションから参照することはできない
■例題の範囲をおさらい
参考:「SQLでデータを自在に操作する」
読み取り一貫性とは、あるトランザクションが変更中のデータをほかのトランザクションが参照したとき、変更前の確定済みのデータを参照させる機能です。この読み取り一貫性によって、データの整合性を保つことができます。
■正解
c、d
■解説
選択肢a:読み取り一貫性とは、あるトランザクションがデータを変更中のとき、ほかのトランザクションからは変更される前のデータを参照させる機能です。
選択肢b:読み取り一貫性の機能では、ほかのトランザクションからは変更前の確定されたデータを参照します。
<ユーザーAで実行>
SQL> update test
2 set col1=20
3 where col1=10;
1行が更新されました。
SQL> select * from test;
COL1
----------
20 |
<ユーザーBで実行>
SQL> select * from a.test;
COL1
----------
10 |
ユーザーAが「20」にUPDATEし、まだCOMMITしていないとき、ユーザーBがそのデータをSELECTすると、戻ってくる値は「10」です。
選択肢c:選択肢bの解説のとおり、ユーザーBは確定前の「10」を参照します。
データを変更中のユーザーAは、変更して確定前の値を確認できます。
SQL> select * from test;
COL1
----------
20 |
しかし、ユーザーBはこのデータが変更される前の値「10」を参照します。
SQL> select * from a.test;
COL1
----------
10 |
実際のデータは、ユーザーAによって10から20に変更されています。ユーザーBは、変更前の確定されたデータが格納されている「UNDOブロック」からデータを参照しています。これが読み取り一貫性です。
ユーザーAがCOMMITすれば、ユーザーBは変更後の値を参照できます。
<ユーザーA>
SQL> commit;
コミットが完了しました。
<ユーザーB>
SQL> select * from a.test;
COL1
----------
20 |
選択肢d:あるトランザクションで変更した確定前のデータを、ほかのトランザクションから確認することはできません。ほかのトランザクションからは、変更前の確定済みのデータを参照することができます。
変更を行っているトランザクションであれば、確定前のデータの確認は可能です。
<変更を行っているトランザクションからの確認>
SQL> update test
2 set col1=20
3 where col1=10;
1行が更新されました。
SQL> select * from test;
COL1
----------
20 |
よって、正しい説明はc、dです。
■まとめ
次の内容をチェックしましょう。
今回の範囲は、トランザクションについての基本的な内容です。一度覚えてしまえば応用が利くので、確実に理解し、得点を稼ぎましょう。
ただし、読み取り一貫性を詳しく理解するためには、Bronze DBAの範囲のスキルが必要です。
次回は表の作成と管理について、間違いやすい点にポイントを絞って説明します。
Copyright © ITmedia, Inc. All Rights Reserved.