[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 メーリングリストの案内