2014-01-18 54 views
1

競爭條件我有3個表:當插入一行

Counters: ID, ItemCatalogID, CurrentCounter 

Item: ID, ItemCatalogID, Name, Description, OtherValue 

ItemCatalog: ID, Name, Description 

計數器表包含項目目錄CurrentCounter,當我插入一排,我要查詢數據庫,獲取相應目錄的當前計,然後將此值更新爲1,並將此值用於「其他值」字段。

例如:

update Counters set CurrentCounter = CurrentCounter + 1 where ItemCatalogID = 100; 
select CurrentCounter into v from Counters where ItemCatalogID = 100; 
insert into Item(ItemCatalogID, Name, Description, OtherValue) values (100, 'MyItem', 'Short Description', v); 

但我不知道,可能會發生衝突情況嗎?如何改進我的解決方案?

回答

1

是的,您的情況可能會導致競爭條件的異常。

你是否需要這些計數器?您可以輕鬆地查詢合適的替換它們:

SELECT COUNT(*) FROM ItemCatalog WHERE ID=100; 
SELECT COUNT(*) FROM Item WHERE ID=100; 

對於連續字段內容,建議使用AUTO_INCREMENT列。但它似乎不適用於你的情況。

但無論如何,你可以使用COUNT(*)辦法從上面:

insert into Item(ItemCatalogID, Name, Description, OtherValue) values (100, 'MyItem', 'Short Description', (select count(*) from Item where ID=100)); 

這可能是你必須你的別名表的事件之一:

insert into Item(ItemCatalogID, Name, Description, OtherValue) values (100, 'MyItem', 'Short Description', (select count(*) from Item AS I where ID=100)) 

此執行只需一步,您就不必擔心競賽狀況。

如果由於任何原因無法更改,還有另一種解決方案:使用表鎖定。

前綴您的語句與

LOCK TABLES Counters WRITE, Item WRITE 

UNLOCK TABLES 

,以對它們具有獨佔寫訪問後綴他們。

+0

假設ID = 100的ItemCatalog具有30個項目。現在我想將第31項插入「Item」表中,此項的「OtherValue」字段將爲31.如何使用您的策略執行此操作? –

+0

我詳細闡述了一點。 – glglgl

+0

非常感謝!我是PHP/MySQL世界的新手。我想我必須努力學習。 –