プログラムで作成された変更のアイソレーションレベルを設定します。
Read Committed | このアイソレーションレベルでは、ほかのユーザーによる変更はコミットが実行されるまでプログラムからは認識できません。これが既定値です。 |
Repeatable Read | このアイソレーションレベルでは、プログラムがコミットを行うまで、参照されるすべてのレコードに対して、ほかのユーザーによって行われた更新を読み取りません。 |
Serializable | このアイソレーションレベルでは、プログラムがコミットを行うまで、参照されるすべてのレコードに対して、ほかのユーザーによって行われた更新、挿入、または削除を読み取りません。 |
Read Uncommitted | このアイソレーションレベルでは、プログラムがまだコミットを実行していない場合でも、他のユーザーが行った変更を確認します。 |
データストアで利用できます。
データストア: Iseries、DB2 UDB、INFORMIX、MYSQL、ORACLE、POSTGRESQL、SQLSERVER
ジェネレーター: .NET、
Java
アイソレーションレベルの設定は、読み取りと並行処理のコントロールに影響します。Read Committed を使用すると、より高いレベルの一貫性が得られますが、データベースのロックが多くなります。アイソレーションレベルの詳細については、
https://en.wikipedia.org/wiki/Isolation_(database_systems) およびほかの DBMS のドキュメントを参照してください。
重要:
- このプロパティは Oracle では読み取り専用となり、値は Read Committed です (Oracle のデータベースではダーティーリードは行われず、ダーティーリードを許可することもありません)。
- SQLite (Android および iOS プログラム) で使用されるアイソレーションレベルは Read Committed です。
このプロパティは設計時にのみ適用されます。
次の
プロシージャーが定義されている、項目属性 A B の
トランザクションを考えてみます。
Procedure1
//項目属性に新しい値を入力し、変更をコミットします。
new
A=1
B=1
endnew
commit
//ほかの新しい値を入力しますが、今回は確認しません。
new
A=2
B=2
endnew
//B の値を含むメッセージを画面に出力します。
for each
msg(B.ToString())
//どのアイソレーションレベルでも、1 と 2 が表示されます。
endfor
//Procedure2 を実行します。
Procedure2()
//Procedure2 の実行後、B の値を含むメッセージを内部変数に格納し、処理を続行します
// (プログラムの処理が終了するまで、ユーザーにメッセージは表示されません) 。
//次に、これまでに行った変更を保存します。
for each
msg(B.ToString(), nowait) //Read Uncommited と Read Commited には、11、2、3 が表示されます。
//Repeatable Read および Serializable 1、2 です。
endfor
commit
//メッセージを B の値とともに内部変数に保存し、処理を続行します。
for each
msg(B.ToString(), nowait) //Serializable 以外のアイソレーションレベルでは、11、2、および 3 が表示されます。
//Serializable では、Procedure2 で更新または新規作成を実行できなかったため、
//1, 2 と表示され、コミットされていない変更があります。
endfor
Procedure2 は新しい LUW で Execute を設定しました。
//B の値を画面に表示します。
for each
msg(B.ToString()) //Read Uncommited では 1 と 2 が表示され、その他では 1 のみが表示されます。
endfor
//A の値が 1 である限り、B の値を更新します。
for each
where A = 1
B=11 Endfor //A と B に新しい値を追加します。
new
A = 3 B = 3
endnew
プロパティの値を設定したときに、それに対応する変更を適用するには、 [
すべてリビルド ] を実行します。
SAC #43993 には、設定ファイル、変換などの関連情報についての詳細が記載されています。