假設我有這樣的架構:
CREATE TABLE "test2" (
"id" SERIAL NOT NULL,
"text" CHAR(10),
PRIMARY KEY ("id")
);
CREATE TABLE "test1" (
"id" SERIAL NOT NULL,
"fkey" INTEGER NOT NULL,
"order" INTEGER NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("id")
);
ALTER TABLE "test1" ADD FOREIGN KEY ("fkey") REFERENCES "test2"("id") ON DELETE CASCADE ON UPDATE CASCADE;
對于一些性能優化,我想存盤在“order”欄位中,“test1”表中的行數參考“test2”中的同一行。所以我在插入時嘗試這個:
insert INTO "test1"
("fkey","order")
select '3', count(*) from "test1" where "fkey"='3';
這會不會有并發問題?(例如兩個執行緒同時插入到test1,fkey相同, order的值會不會出錯?如何解決這個問題?
uj5u.com熱心網友回復:
是的,當同時完成多個插入時,您需要考慮并發問題。
有幾種解決方案。在我的頭頂上,我可以看到:
- 獲取資料庫中的排他鎖。可能主表中的一行就可以了。
- 管理資料庫外部的鎖或信號量。
- 插入行,但
order以延遲的方式更新行,可能使用佇列(很可能是優先級佇列)或單個單獨的行程。 - 插入時使用樂觀鎖定。
每一個都有一些缺點,所以它取決于你的具體要求。
我猜您不想每次插入新孩子時都更新所有兄弟姐妹;就性能而言,這可能是矯枉過正。如果這聽起來合理,也許您可??以使用優先級佇列,每 10 分鐘(左右)運行一個行程,將同一父級的所有子級分組并立即更新它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421793.html
標籤:
