PostgreSQL教程(九):事物隔離紹介
2206 ワード
SQLの基準では、事物分離レベルは以下の4つに分類される。
1.未読(Read uncomitted)
2.読んで提出しました。
3.繰り返して読むことができます。
4.シリアル化可能(Serializable)
しかし、PostgreSQLは9.1以前のバージョンでは、読みはすでに提出されており、シリアル化されています。実際のアプリケーションで他の2つが選択されると、PostgreSQLは、より厳格な隔離レベルに自動的に調整されます。PostgreSQL v 9.1のバージョンでは、元のバージョンに基づいて重複可能な読み取りを追加する3つの実施形態が提供されている。このブログでは2)と4)だけについて説明し、比較します。9.1で3)と4)の違いも小さいです。
提出済み
シリアル化可能
PostgreSQLデフォルト隔離レベル
はい、
いいえ、
他のものが未提出のデータが表示されますか?
表示しない
表示しない
実行効率
高さ
低い
適用シーン
簡単なSQL論理は、SQL文にネスティングされたクエリが含まれている場合、複数のSQLクエリにおいて、異なるバージョンのデータが得られる可能性が高い。
複雑なSQL論理、特にネスティングされたクエリが適用されます。
SELECTで一致点を調べる
このSELECTクエリの開始時に、このクエリの実行中に、他の任意の同時物事は、このクエリの結果セットに対するデータ操作は、今回のクエリによって読み取られません。つまり、今回のクエリで取得したデータバージョンは、クエリの開始時のデータバージョンと一致します。
このSELECTクエリがあるものから開始された場合、このクエリの実行中に、他の任意の同時事物は、このクエリの結果セットに対するデータ操作は今回のクエリによって読み取られません。つまり、今回のクエリで得られたデータバージョンは、クエリがあるものの開始時のデータバージョンと一致します。
同僚の物の中のデータ操作が見えますか?
例えば、同じものをudateやselectで操作しても、現在のものはまだ提出されていなくても、udateの修正は、現在のものの後ろのselectで見られます。
提出したのと同じです。
同僚のものが何度も同じselectで見たデータは同じですか?
このレベルのselectの一致した時点がクエリの実行開始時であるため、複数のクエリの時点は間違いなく同じではありません。最初のクエリから2番目のクエリの開始までの間に、他の並行したものが修正されて提出されたり、現在のものが検索対象のデータだけを修正したりして、これらのデータ操作の結果は、第二のクエリにおいて反映されます。
2つのステップに分けて、同じものに対する修正が2つの照会文の間で行われると、2番目のクエリーにこれらの修正結果が表示されます。しかし、他の併発事物の修正に対しては、何の影響も与えない。すなわち、二回のselectの結果は同じである。その理由は明らかであり、この隔離レベルのselect一致時間点は、物事の開始時と一致している。
同じ行のデータの変更
この時、二つの同時のものが同じ行のデータを修正している場合、先に修正したものはその行にロックをかけます。もう一つのものは第一のものがその行を操作するまで待機状態になります。最初の行に対する修正操作が最終的にその事物によってロールバックされた場合、第二の修正操作は終了待ち後、直接にデータを修正する。しかし、最初の操作が正常に行われている場合には、この操作のタイプをさらに判断し、行を削除する場合には、2番目の修正動作はそのまま無視されます。udateの行の記録であれば、2番目の修正操作は、その行が依然として前に定義された修正条件に合致しているかどうかを見直す必要があります。
読み切りレベルが提示されている仕組みとほぼ同じですが、最初の修正操作が提出された後、二つ目の操作は、もはや区別されない前の修正がdeleteですか?それともudateですか?直接に次の情報に戻ります。Error:Can't serialize access due to concurrent udate。シリアル化可能な事務がシリアル化されてから他の事務に変更された行を変更またはロックできないからです。したがって、アプリケーションがこのようなエラーメッセージを受信すると、現在のトランザクションを終了して、最初から全体のトランザクションを再起動する必要があります。アプリケーションでも、このようなエラーを専門に処理するために必要なコードが必要です。
最後に説明したいのは、圧倒的多数の場合、すでに提出されたレベルが適用され、しかもこのレベルの同時進行効率がより高いことです。特別な場合に限って、現在の事物の隔離レベルをマニュアルでシリアル化または繰り返し読むことができるように調整します。
1.未読(Read uncomitted)
2.読んで提出しました。
3.繰り返して読むことができます。
4.シリアル化可能(Serializable)
しかし、PostgreSQLは9.1以前のバージョンでは、読みはすでに提出されており、シリアル化されています。実際のアプリケーションで他の2つが選択されると、PostgreSQLは、より厳格な隔離レベルに自動的に調整されます。PostgreSQL v 9.1のバージョンでは、元のバージョンに基づいて重複可能な読み取りを追加する3つの実施形態が提供されている。このブログでは2)と4)だけについて説明し、比較します。9.1で3)と4)の違いも小さいです。
提出済み
シリアル化可能
PostgreSQLデフォルト隔離レベル
はい、
いいえ、
他のものが未提出のデータが表示されますか?
表示しない
表示しない
実行効率
高さ
低い
適用シーン
簡単なSQL論理は、SQL文にネスティングされたクエリが含まれている場合、複数のSQLクエリにおいて、異なるバージョンのデータが得られる可能性が高い。
複雑なSQL論理、特にネスティングされたクエリが適用されます。
SELECTで一致点を調べる
このSELECTクエリの開始時に、このクエリの実行中に、他の任意の同時物事は、このクエリの結果セットに対するデータ操作は、今回のクエリによって読み取られません。つまり、今回のクエリで取得したデータバージョンは、クエリの開始時のデータバージョンと一致します。
このSELECTクエリがあるものから開始された場合、このクエリの実行中に、他の任意の同時事物は、このクエリの結果セットに対するデータ操作は今回のクエリによって読み取られません。つまり、今回のクエリで得られたデータバージョンは、クエリがあるものの開始時のデータバージョンと一致します。
同僚の物の中のデータ操作が見えますか?
例えば、同じものをudateやselectで操作しても、現在のものはまだ提出されていなくても、udateの修正は、現在のものの後ろのselectで見られます。
提出したのと同じです。
同僚のものが何度も同じselectで見たデータは同じですか?
このレベルのselectの一致した時点がクエリの実行開始時であるため、複数のクエリの時点は間違いなく同じではありません。最初のクエリから2番目のクエリの開始までの間に、他の並行したものが修正されて提出されたり、現在のものが検索対象のデータだけを修正したりして、これらのデータ操作の結果は、第二のクエリにおいて反映されます。
2つのステップに分けて、同じものに対する修正が2つの照会文の間で行われると、2番目のクエリーにこれらの修正結果が表示されます。しかし、他の併発事物の修正に対しては、何の影響も与えない。すなわち、二回のselectの結果は同じである。その理由は明らかであり、この隔離レベルのselect一致時間点は、物事の開始時と一致している。
同じ行のデータの変更
この時、二つの同時のものが同じ行のデータを修正している場合、先に修正したものはその行にロックをかけます。もう一つのものは第一のものがその行を操作するまで待機状態になります。最初の行に対する修正操作が最終的にその事物によってロールバックされた場合、第二の修正操作は終了待ち後、直接にデータを修正する。しかし、最初の操作が正常に行われている場合には、この操作のタイプをさらに判断し、行を削除する場合には、2番目の修正動作はそのまま無視されます。udateの行の記録であれば、2番目の修正操作は、その行が依然として前に定義された修正条件に合致しているかどうかを見直す必要があります。
読み切りレベルが提示されている仕組みとほぼ同じですが、最初の修正操作が提出された後、二つ目の操作は、もはや区別されない前の修正がdeleteですか?それともudateですか?直接に次の情報に戻ります。Error:Can't serialize access due to concurrent udate。シリアル化可能な事務がシリアル化されてから他の事務に変更された行を変更またはロックできないからです。したがって、アプリケーションがこのようなエラーメッセージを受信すると、現在のトランザクションを終了して、最初から全体のトランザクションを再起動する必要があります。アプリケーションでも、このようなエラーを専門に処理するために必要なコードが必要です。
最後に説明したいのは、圧倒的多数の場合、すでに提出されたレベルが適用され、しかもこのレベルの同時進行効率がより高いことです。特別な場合に限って、現在の事物の隔離レベルをマニュアルでシリアル化または繰り返し読むことができるように調整します。