2013-01-09 84 views
1

我有gifts_countuser_id領域MySql-什麼時候應該使用鎖

一個用戶表我要補充鎖定下一個語句(它可能來自多個線程)?

update users set gifts_count = gifts_count + 1 where users.user_id = user_id; 

回答

2

最好的辦法是使用transactions而不是顯式鎖定表。

一個例子會議將是這個樣子:

START TRANSACTION; 
UPDATE `users` SET `gifts_count` = `gifts_count` + 1 WHERE `users`.`user_id` = user_id; 
COMMIT; 

你也可以做一些完整性檢查,如果你需要(取決於你在做什麼),查詢和COMMIT之間,如果事情出錯了,你總是可以用ROLLBACK


如果要防止在特定行讀取時,它的更新(如果使用InnoDB與行級鎖定),您可以用LOCK IN SHARE MODE末運行SELECT查詢,像這樣:

SELECT * FROM `users` `users`.`user_id` = user_id LOCK IN SHARE MODE; 

該查詢將掛起,直到您的交易爲COMMIT ed或ROLLBACK'd。

+0

當我使用交易時,我的gift_count是否可以閱讀? –

+0

@Babibu他們是。我猜如果你不希望這是可能的,你應該*使用鎖定(即行級讀鎖); **編輯**:其實,我甚至不確定,沒有使用這一段時間,讓我檢查一下。 –

+0

@Babibu是的,它仍然可讀。 –

相關問題