我有類似於網上聊天客戶端的東西。當一個用戶發送一條消息時,它將被存儲在一個帶有id=currentID+1
的MySQL數據庫表中。我有另一個客戶端長時間輪詢並等待消息'id = currentID + 1'。MySQL的鎖定問題
在此交換之後,該行永遠不會再使用。
我需要在這種情況下,鎖?我擔心的是閱讀PHP端能夠在寫入PHP端完成創建行之前看到該行並讀取其值。
我有類似於網上聊天客戶端的東西。當一個用戶發送一條消息時,它將被存儲在一個帶有id=currentID+1
的MySQL數據庫表中。我有另一個客戶端長時間輪詢並等待消息'id = currentID + 1'。MySQL的鎖定問題
在此交換之後,該行永遠不會再使用。
我需要在這種情況下,鎖?我擔心的是閱讀PHP端能夠在寫入PHP端完成創建行之前看到該行並讀取其值。
在讀取完成之前,MySQL不會使該行可用(在MyISAM的情況下,它會自動獲取表鎖,或者在INNODB的情況下會自動獲取行鎖)因此,只要您「再只插入行(而不是稍後再打上更新等)...
在MySQL中寫是原子,其他查詢無法‘看到’行,直到它完全寫的,假設你使用單INSERT
語句來做到這一點。
你的意思是在MySQL刀片是原子嗎?如果寫入是原子的,我不認爲我們需要鎖。 – 2010-05-21 17:55:21
@teehoo:不,我的意思是寫道。當你想以原子方式執行多個*寫操作時會使用鎖。例如,從一個賬戶中扣除餘額並將其存入另一個賬戶需要在交易中完成。但是,如果你做一個單一的插入或更新語句,沒有人能看到它,直到它完成(即,如果你更新5列,他們將不會看到它在只有3更新的狀態)。 – ryeguy 2010-05-21 22:10:14
新行只會通過選擇查詢後其插入。
可見插入是原子的
並且是myisam提供表級鎖定,而innodb提供行級鎖定。
和一組事務中的語句被認爲是atmoic,任何讀取都不會看到效果,直到事務提交,您可以執行select shared
來查看未提交的數據。
所以讓我弄清楚這一點。插入操作總是隱式鎖定表(ISAM)或行(innoDB)? – 2010-05-21 17:56:28
正確。 InnoDB可能會更復雜一點,因爲您可以在發出commit命令之前擁有一個鎖定事務。但是對於一般使用(不啓動InnoDB的交易),這是正確的...... – ircmaxell 2010-05-21 18:20:59