1
我有gifts_count
和user_id
領域MySql-什麼時候應該使用鎖
一個用戶表我要補充鎖定下一個語句(它可能來自多個線程)?
update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
我有gifts_count
和user_id
領域MySql-什麼時候應該使用鎖
一個用戶表我要補充鎖定下一個語句(它可能來自多個線程)?
update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
最好的辦法是使用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。
當我使用交易時,我的gift_count是否可以閱讀? –
@Babibu他們是。我猜如果你不希望這是可能的,你應該*使用鎖定(即行級讀鎖); **編輯**:其實,我甚至不確定,沒有使用這一段時間,讓我檢查一下。 –
@Babibu是的,它仍然可讀。 –