2014-03-27 148 views
0

我有一個MySql數據庫託管在一個Web服務器上,它有一組包含數據的表。我將發佈使用HTML5/Javascript/CS3構建的前端應用程序。在MySql表中同時插入/更新?

現在,當多個用戶試圖在同一時間插入/更新到其中一個表中時,它會創建一個衝突,或者它會自動處理表的鎖定,例如,當一個用戶正在使用時,它會爲他鎖定表格,然後讓其餘的在用戶完成後進入隊列,然後釋放鎖定,然後將其放入隊列中的下一個?難道這會發生什麼或做我需要處理在MySQL數據庫中的情況下

例:

當用戶想要插入到他所說的位於其具有插入Web服務器的PHP文件數據庫命令將數據發佈到數據庫中。我擔心兩個或兩個以上的人同時插入是否會進行更新。

mysqli_query($con,"INSERT INTO cfv_postbusupdate (BusNumber, Direction, StopNames, Status, comments, username, dayofweek, time) VALUES (".trim($busnum).", '".trim($direction3)."', '".trim($stopname3)."', '".$status."', '".$comments."', '".$username."', '".trim($dayofweek3)."', '".trim($btime3)."')"); 
+0

你可以詳細說明你的意思是「插入/更新」嗎?你能提供一個簡單的'INSERT'語句作爲例子嗎?你擔心什麼樣的衝突?你能提供一個這樣的衝突的例子嗎? – danorton

回答

1

MySQL自動處理表鎖定。

請注意,使用MyISAM引擎時,整個表會被鎖定,並且語句會阻塞(「排隊」),等待釋放鎖。

InnoDB引擎提供了更多的併發性,並且可以執行行級鎖定,而不是鎖定整個表。

例如,如果您想保持參照完整性,並且您希望禁止其他會話在會話執行期間對任何表進行更改,則可能有一些情況下您想要鎖定多個MyISAM表是工作。但是,這確實會導致併發性;這應該更像是一個「管理」類型的函數,並不是一個併發應用程序應該做的事情。

如果您正在使用事務(InnoDB),則應用程序需要處理的問題是表中的行被鎖定的順序;當MySQL檢測到有兩個(或更多)事務無法繼續進行時,應用程序可能會遇到「死鎖」異常,因爲每個事務都需要獲取其他持有的鎖。 MySQL能做的唯一事情就是檢測到這一點,而且MySQL唯一能做的就是選擇其中一個事務作爲受害者,那就是會導致「死鎖」異常的事務,因爲MySQL會殺死它,允許至少要進行一項交易。