我想緩存的聚集,但由於併發可能會遇到一個參照完整性違規..如何管理鎖來防止重複插入
下面是我在做什麼(樣的歸結了一下) :
select low, high
into l_low, l_high
from nasd_stats
where symbol_id = l_symbol_id;
if(l_low is NULL) then
select max(last),
min(last)
into l_high, l_low
from nasd
where symbol_id = l_symbol_id;
insert into nasd_stats values (l_symbol_id, l_low, l_high);
end if;
所以,兩個用戶可以運行具有此代碼的存儲過程,等檢測,同時,也l_low爲空,然後都嘗試在分鐘後同時插入nasd_stats/max聚合(其中一個失敗,因爲在基於symbol_id的nasd_stats上有唯一鍵)。
任何想法如何防止發生?
我猜我能做到這一點:
Start Transaction;
delete from nasd_stats where symbol_id = l_symbol_id;
insert into nasd_stats values (l_symbol_id, l_low, l_high;
Commit;
邏輯存在,刪除將鎖定該行(即使它不存在),然後在插入會做我想做的事。
TIA。
唐
['SELECT ... FOR UPDATE'](http://dev.mysql.com/doc/refman/5.5/ en/innodb-locking-reads.html) – eggyal 2012-04-29 10:10:43
涉及兩個表格。我不能選擇一個,並鎖定不參與選擇的第二個......我可以嗎? – 2012-04-29 10:30:05
否,但是'SELECT ... FOR UPDATE'會鎖定第一個表,以防止併發查詢獲得'low'和'high',直到釋放鎖(提交事務後)。 – eggyal 2012-04-29 10:32:13