[pgpool-general-jp: 157] Re: pgpoolでのupdateについて

Mizuno Shinya 098.mizuno.shinya @ gmail.com
2007年 6月 4日 (月) 12:36:33 JST


浅羽様

>>>> A) update table1 set value=100 where id=1
>>>> B) update table1 set value=200 where id=1
>>>>
>>>> この二つのクエリが別トランザクションで同時に実行された場合、
>>>> 最終的に「value」の値はどのようになるのでしょうか。
>>>
>>> マスタで先に行ロックを獲得したトランザクションが先に UPDATE
>>> を実行します。これは replication_strict = true の場合のみです。
>>
>> 行ロックが必要と言うことですね。了解いたしました。
>> この行ロックはWEBアプリ側から明示的に指定をする必要がありま
>> すでしょうか。
>> それとも、「insert_lock=true」としたときのように、pgpoolが自
>> 動で対応してくださるのでしょうか。
>
> いえ、PostgreSQL では UPDATE や DELETE をする際に暗黙的に行ロックを獲
> 得するようになっています。


ありがとうございます。
「暗黙的に行ロック」の件、理解できました。

ですが、まだ、全体的によくわかっていません。すみません。

replication_strict=true にすれば、「常にsecondaryはmasterの
問い合わせ処理が終わってから、問い合わせを処理する」とのこと
ですが、以下のようにはならないのでしょうか。

  ----MASTER----  ---SECONDARY---
  transA  transB  transA  transB

  update
          update
                          update
                  update


「update」を「begin」「end」でくくれば、以下のように、先にマ
スタで「update」を処理したほうが、セカンダリでも「update」を
先に実行できます。
その後の「end」を実行するときは、すでに、セカンダリでも
「update」が処理されていることが、言えますので、マスタとセ
カンダリでの実行順序が保たれると思います。
(「begin」と「end」はあえて、ごちゃごちゃさせてみました)

  ----MASTER----  ---SECONDARY---
  transA  transB  transA  transB

          begin
                          begin
  begin
                  begin
  update
                  update
  end
          update
                  end
          end
                          update
                          end

「update」一文だけだと、実行順序が正しく制御できない気がして
おります。

お手数をおかけしますが、よろしくお願いいたします。


pgpool-general-jp メーリングリストの案内