-
Notifications
You must be signed in to change notification settings - Fork 82
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Serializable分離レベルで一意性違反を生じるアプリケーションの例 #3077
Comments
結論から言うと、現在の訳で正しいと思います。
とあります。For example..は、これを受けて2種類の例を提示し、前の文の"explicitly check if they can do so first. "を実施なければならない具体例2つを示していると考えられます。最初の例では、"trying to select it first"が"check"に相当します。後の例では、"selecting the maximum existing key and adding one"です。 具体的にSQLで例を示します。以下、T1, T2は2つのpsqlセッションを表していると考えてください。
では、T2がこのプロトコルを守らずに(つまり"select * from t1 where t = 'p1';"を実行しないで)、いきなりinsertしたらどうなるでしょうか?この場合、直列化エラーにならず、一意性違反になってしまいます。 もう一つの例"generates a new key by selecting the maximum existing key and adding one."では、たとえば以下のような例で確認できます。
この例で、T2がこのプロトコルを守らずに(つまり"insert into t2 select max(i) + 1, 2 from t2;"を実行しないで)、いきなり"insert into t2 values(2,2)"としたらどうなるでしょうか?この場合も、直列化エラーにならず、一意性違反になります。 |
はい、その通りですが、原文の趣旨としては「selectでそれがすでに存在しているか確かめる」をしなければ一意性違反が生じる、ということだと思います。 |
詳細にありがとうございます。
このT2における一意性違反は、T1→T2とシリアル実行した結果と整合的です。 一方で、T2がselectなしに先にinsertし、そのまま先にcommitした場合、
や
では、T1で一意性違反が発生します。これは、T1→T2(T2で一意性違反)や、T2→T1(そもそもselectで検出できるはず)のどちらの結果とも整合せず、これが「本当のシリアル実行では起こらないエラー」に相当するものと理解しました。 後者のアプリケーションでも、T1でのBEGIN後に、T2で直接insertしcommitしてから、T1で お手を煩わせてしまい申し訳ありませんでした。 |
ご理解いただきありがとうございます。
いえ、とんでもありません。私も勉強になりました。 |
問題の詳細
https://www.postgresql.jp/document/16/html/transaction-iso.html#XACT-SERIALIZABLE
は、
と訳されていますが、
「~なアプリケーションか、~なアプリケーション」ではなく、「~確かめ、もし存在していればすでに存在している最大のキーに1加えて新しいキーを生成するアプリケーション」という1つのアプリケーションを示しているのではないでしょうか。
「ユーザに新しいキーを聞いてからまずselectでそれがすでに存在しているか確かめるアプリケーション」では、一意性違反は生じないように思います。
提案:
確認した範囲では、9.6以降にある節のようです。
貢献者として記載可否
記載(貢献者欄に書いてください)
貢献者名
三谷知広
The text was updated successfully, but these errors were encountered: