新聞中心
以下的文章主要是對MySQL鎖表的概念的介紹,以及介紹MySQL表鎖在什么設想的情況下就不利了,如果你對MySQL表鎖的相關內容感興趣的話,以下的文章就是主要內容介紹,望你在瀏覽之后會有所收獲。

創(chuàng)新互聯建站成都網站建設按需設計網站,是成都網站營銷公司,為白烏魚提供網站建設服務,有成熟的網站定制合作流程,提供網站定制設計服務:原型圖制作、網站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網站改版熱線:13518219792
MySQL鎖表
為了能有快速的鎖,MySQL除了 InnoDB 和 BDB 這兩種存儲引擎外,所有的都是用表級鎖(而非頁、行、列級鎖)。
對于 InnoDB 和 BDB 表,MySQL鎖表只有在指定用 LOCK TABLES 鎖表時才使用表級鎖。在這兩種表中,建議最好不要使用 LOCK TABLES,因為 InnoDB 自動采用行級鎖,BDB 用頁級鎖來保證事務的隔離。
如果數據表很大,那么在大多數應用中表級鎖會比行級鎖好多了,不過這有一些陷阱。
表級鎖讓很多線程可以同時從數據表中讀取數據,但是如果另一個線程想要寫數據的話,就必須要先取得排他訪問。正在更新數據時,必須要等到更新完成了,其他線程才能訪問這個表。
更新操作通常認為比讀取更重要,因此它的優(yōu)先級更高。不過最好要先確認,數據表是否有很高的 SELECT 操作,而更新操作并非很‘急需’。
表鎖鎖在一個線程在等待,因為磁盤空間滿了,但是卻需要有空余的磁盤空間,這個線程才能繼續(xù)處理時就有問題了。這種情況下,所有要訪問這個出問題的表的線程都會被置為等待狀態(tài),直到有剩余磁盤空間了。
MySQL表鎖在以下設想情況中就不利了:
一個客戶端提交了一個需要長時間運行的 SELECT 操作。
其他客戶端對同一個表提交了 UPDATE 操作,這個客戶端就要等到 SELECT 完成了才能開始執(zhí)行。
其他客戶端也對同一個表提交了 SELECT 請求。由于 UPDATE 的優(yōu)先級高于 SELECT,所以 SELECT 就會先等到 UPDATE 完成了之后才開始執(zhí)行,它也在等待第一個 SELECT 操作。
下列所述可以減少表鎖帶來的資源爭奪:
讓 SELECT 速度盡量快,這可能需要創(chuàng)建一些摘要表。
啟動 mysqld 時使用參數 --low-priority-updates。這就會讓更新操作的優(yōu)先級低于 SELECT。這種情況下,在上面的假設中,第二個 SELECT 就會在 INSERT 之前執(zhí)行了,而且也無需等待第一個SELECT 了。
可以執(zhí)行 SET LOW_PRIORITY_UPDATES=1 命令,指定所有的更新操作都放到一個指定的鏈接中去完成。
用 LOW_PRIORITY 屬性來降低 INSERT,UPDATE,DELETE 的優(yōu)先級。
用 HIGH_PRIORITY 來提高 SELECT 語句的優(yōu)先級。
從MySQL 3.23.7 開始,可以在啟動 mysqld 時指定系統變量 max_write_lock_count 為一個比較低的值,它能強制臨時地提高表的插入數達到一個特定值后的所有 SELECT 操作的優(yōu)先級。它允許在 WRITE 鎖達到一定數量后有 READ 鎖。
當 INSERT 和 SELECT 一起使用出現問題時,可以轉而采用 MyISAM 表,它支持并發(fā)的SELECT 和 INSERT 操作。
當在同一個表上同時有插入和刪除操作時,INSERT DELAYED 可能會很有用。
當 SELECT 和 DELETE 一起使用出現問題時,DELETE 的 LIMIT 參數可能會很有用。
執(zhí)行 SELECT 時使用 SQL_BUFFER_RESULT 有助于減短MySQL鎖表的持續(xù)時間.
可以修改源代碼 `mysys/thr_lock.c',只用一個所隊列。這種情況下,寫鎖和讀鎖的優(yōu)先級就一樣了,這對一些應用可能有幫助。
當前文章:MySQL鎖表在那些情況中是不利的?
網頁網址:http://www.5511xx.com/article/cdhohpp.html


咨詢
建站咨詢
