我有點想知道我正在做一個大桌子的更新,我是否需要擔心鎖。在PostgreSQL中,對同一個表中的不同行進行多個更新,並存在鎖定衝突?
我有一個表看起來像這樣:
CREATE TABLE "ItemsToProcess"(
"id" text,
"WorkerInstanceId" text,
"ProcessingStartTime" timestamp with time zone,
"UpdatedTime" timestamp with time zone,
CONSTRAINT "ITP_PK" PRIMARY KEY ("id")
)WITH (
OIDS=FALSE
);
最初,這個表有〜在這2.0萬行,並填寫,WorkerInstanceId只有ID和兩個時間戳爲空默認情況下,開頭的運行。
會發生什麼是一些工人應用程序(至少兩個,但將在生產中大約10-13)將從這個表中標記一批ID-s(我打算將batchSize設置爲200)以處理。處理過程中發生的事情現在無關緊要。 一批標記看起來是這樣的:
UPDATE "ItemsToProcess"
SET "WorkerInstanceId" = ?, "ProcessingStartTime" = current_timestamp()
WHERE "WorkerInstanceId" is NULL
LIMIT 200;
我的問題是,我需要擔心鎖定我要去使得更新之前更新行?
Postgres的文件說:
ROW EXCLUSIVE
衝突與共享,共享ROW EXCLUSIVE,EXCLUSIVE,和ACCESS EXCLUSIVE鎖模式。
UPDATE,DELETE和INSERT命令獲取目標表上的此鎖定模式(除了任何其他引用的表上的ACCESS SHARE鎖定)。一般來說,這種鎖定模式將由修改表中數據的任何命令獲取。
所以我認爲,只要其中一個工作人員進行此更新,整個表就會被鎖定,200行將被更新,最後鎖定將被釋放。在鎖定到位之前,其他工作人員正在等待鎖定釋放。我是對的還是我想念什麼?
感謝您的幫助!
謝謝!我想知道我可以做什麼來限制更新... – 2012-08-01 15:02:42
對於較小的更新計數,使用'WH IN'子句和'id IN(SELECT t.id FROM thetable t LIMIT 200 ORDER BY id)'子句。請記住,如果沒有'ORDER BY',則使用'LIMIT'是非確定性的。 – 2012-08-01 23:29:31