|
SQL 11章 トランザクション
11.6. トランザクションの定義ここでいうトランザクションの定義とは、SET TRANSACTION 文を用いて、次の項目について設定を行うということです。
トランザクションは、暗黙的に開始された場合でも、明示的に開始された場合でも、SET TRANSACTION 文により上記 3つの項目について設定を行わなかった場合は、それぞれの初期値で実行されます。 SQL92 における SET TRANSACTION の基本構文は次の通りです。
この基本構文のそれぞれの項目について説明します。 アクセスモードは READ ONLY 句または READ WRITE 句で指定します。
READ ONLY 句を指定すると、そのトランザクションは読み取り専用モードになります。このトランザクションで SELECT 文を実行すると、トランザクション開始前の状態のデータを参照することができます。このトランザクション実行中に他のトランザクションでデータに変更が加えられても、その前の状態のデータを参照できるということです。 READ WRITE 句を指定すると、そのトランザクションは読み書き両用モードになります。このトランザクションでは INSERT 文、UPDATE 文及び DELETE 文を使用してデータを変更することができます。このトランザクションで SELECT 文を実行すると、他のトランザクションによるデータの変更も参照することができます。 隔離レベルは、READ UNCOMMITTED 句、READ COMMITTED 句、REPEATABLE READ 句または SERIALIZABLE 句で指定します。
隔離レベルについては表に示す通りですが、複数のトランザクションが同じデータにアクセスすることにより、発生する問題が 4つあります。それは、ロストアップデート、ダーティリード、ノンリピータブルリード及びファントムインサートという現象で、次の表にその説明を示します。
それぞれ、例をあげて説明します。ここでは、テーブル名 TableA、TableA の列 ColA を例に説明します。 TransactionA と TransactionB が、ColA=10 であることを確認した後に、TransactionA が ColA の値を 10 から 8 に変更します。しかし、その直後に TransactionB が ColA の値を 15 に変更してしまうと、TransactionA の行ったデータの更新はデータに反映されなかったことになります。このような現象をロストアップデートといいます。 ![]() TransactionA が TableA の ColA の値を最初に確認した後に、UPDATE 文で ColA の値を 10 から 15 に変更します。この後で、TransactionB は ColA の値を読み取ります。その後、TransactionA が変更処理を ROLLBACK 文で変更してしまったとき、TransactionB の読み取った値は、確定されなかったものになってしまいます。このような現象をダーティリードといいます。 ![]() TransactionB が ColA の値を読み取った後で、TransactionA が ColA の値を 10 から 15 に変更し、その後、TransactionB が再び ColA の値を読み取ると、TransactionB は同じ行に対して 1 回目と 2 回目で異なる値を読み取ってしまうことになります。このような現象をノンリピータブルリードといいます。 ![]() TransactionB が TableA の ColA 列の値の平均を読み取った後で、TransactionA が行を追加し、その後、TransactionB が再び TableA の ColA 列の値の平均を読み取ろうとすると、TransactionB は以前と異なる値を読み取ってしまうことになります。このような現象をファントムインサートといいます。 ![]() 最後に、トランザクションの隔離レベルと隔離性に関する問題の関係をまとめた表を示します。表中の×は起こりうることを意味します。
実習課題 1次の表と関係のある隔離性問題とは何か? 隔離性問題とは、ロストアップデート、ダーティリード、ノンリピータブルリード、ファントムインサートのことである。
実習課題 2次の表と関係のある隔離性問題とは何か? 隔離性問題とは、ロストアップデート、ダーティリード、ノンリピータブルリード、ファントムインサートのことである。
|
![]()
![]()
|