2014-11-14 73 views
0

我有大約500個線程同時工作的循環。我想在每個循環中增加一個計數器。增加同時併發的計數器

最後一行循環:

update counter_tbl set counter=counter+1 where id = 5; 

是否有可能至少有兩個線程皮卡之一counter值,並將其上升到相同的值?

例如,counter是50,在同一時間兩個紗線恰好拾取器50,並增加了,所以線程1更新counter至51和線程2具有51,更新counter至51一次。所以我們會錯過一個增量。這可能嗎?如果是的話,如何避免它?

我可以使用LOCK TABLE但由於其成本我想避免它。

回答

0

實際上這是不可能的,因爲這些是更新語句並且會在事務中運行。

如果您有一個包含兩個或更多語句的事務,則鎖定表僅是必需的。

0

您不必使用LOCK TABLE。數據庫服務器每個事務都一致。在這種情況下,您的查詢是一個事務,並且當兩個線程嘗試更新相同的記錄時,數據庫服務器將處理該一致性。如果可能,交易將按照到貨訂單執行(或者服務器確定的任何訂單),否則將發生死鎖(在這種情況下,您可以安全地在您的特定場景中重新發送交易) 。