前面講過,myisam儲存引擎的讀鎖和寫鎖是互斥的,讀寫操作是序列的。那麼,乙個程序請求某個 myisam表的讀鎖,同時另乙個程序也請求同一表的寫鎖,mysql如何處理呢?答案是寫程序先獲得鎖。不僅如此,即使讀請求先到鎖等待佇列,寫請求後到,寫鎖也會插到讀鎖請求之前!這是因為mysql認為寫請求一般比讀請求要重要。這也正是myisam表不太適合於有大量更新操作和查詢操作應用的原因,因為,大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。這種情況有時可能會變得非常糟糕!幸好我們可以通過一些設定來調節myisam 的排程行為。
¡ 通過指定啟動引數low-priority-updates,使myisam引擎預設給予讀請求以優先的權利。
¡ 通過執行命令set low_priority_updates=1,使該連線發出的更新請求優先順序降低。
¡ 通過指定insert、update、delete語句的low_priority屬性,降低該語句的優先順序。
雖然上面3種方法都是要麼更新優先,要麼查詢優先的方法,但還是可以用其來解決查詢相對重要的應用(如使用者登入系統)中,讀鎖等待嚴重的問題。
另外,mysql也提供了一種折中的辦法來調節讀寫衝突,即給系統引數max_write_lock_count設定乙個合適的值,當乙個表的讀鎖達到這個值後,mysql就暫時將寫請求的優先順序降低,給讀程序一定獲得鎖的機會。
上面已經討論了寫優先排程機制帶來的問題和解決辦法。這裡還要強調一點:一些需要長時間執行的查詢操作,也會使寫程序「餓死」!因此,應用中應盡量避免出現長時間執行的查詢操作,不要總想用一條select語句來解決問題,因為這種看似巧妙的sql語句,往往比較複雜,執行時間較長,在可能的情況下可以通過使用中間表等措施對sql語句做一定的「分解」,使每一步查詢都能在較短時間完成,從而減少鎖衝突。如果複雜查詢不可避免,應盡量安排在資料庫空閒時段執行,比如一些定期統計可以安排在夜間執行。
MySQL鎖概述 MyISAM 表鎖
相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。比如,myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支...
mysql 讀寫鎖 表鎖myisam
讀鎖 session1 lock table book read unlock tables session1可以讀book 不可以寫book 也不可以讀寫其它表 session2可以讀book 也可以讀寫其它表 可以寫book 但阻塞的需要session1解鎖後unlock tables 寫鎖 s...
鎖(MySQL篇) 之MyISAM表鎖
鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制,在資料庫中,除傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問的乙個重要因素。相比其他資料庫而言,mysq...