mysql一


  1. 一、表鎖mysql中最基本的鎖策略,是開銷最小的策略。
    二、表鎖鎖定整張表。用戶在對錶進行寫操作前,需要先獲取寫鎖,阻塞其他用戶對該表的所有讀寫操作。
    三、表鎖在沒有寫鎖時,用戶纔會獲取讀鎖,讀鎖與寫鎖之間是不相互阻塞的
    四、表鎖在特定場景中,表鎖的性能比較良好。
    五、表鎖寫鎖優先級要高於讀鎖,,寫鎖可能會插入到讀鎖之前,讀鎖不能插入到寫鎖之前
    六、ALERT、TABLE之類的語句使用表鎖會忽略存儲引擎的鎖機制
    七、行級鎖可以最大程度的支持併發處理,但是開銷要比表鎖大。
    八、行級鎖只在存儲引擎層實現。
  2. 事務
    一、事務內的語句要麼全部執行成功,要麼全部執行失敗,不會出現有的執行成功,有的沒有執行失敗。
    二、原子性是指一個事務必須被視爲一個不可分割的最小工作單位。
    三、一致性是指數據庫總是從一個一致性的狀態轉換到另外一個一致性的狀態。
    四、隔離性是指一個事務所做的修改在最終提交之前,對其他事務是不可見的(一般情況下,隔離級別不一樣,效果不太一樣的)。
    五、持久性是指一旦事務提交,所做的修改就會永久保存到數據庫中
    六、使用事務和使用鎖一樣會增加系統的開銷
    七、使用start transaction; sql 語句塊; COMMIT; ROLLBACK;commit在成功是進行提交,rollback是在有失敗的情況下進行回滾。
  3. 隔離級別
    一、主要是針對事務的
    二、未提交讀(READ UNCOMMITTED):事務中的修改,即使沒有進行提交,對其他事務也是可讀的,事務可以讀取未提交的數據(髒讀),很少使用該隔離級別除非有非常必要的理由的情況下不要使用該隔離級別。
    三、提交讀(READ COMMITTED):只有當事務提交後其他事務纔是可以可見的。
    四、可重複讀(REPEATABLE READ):可以解決髒讀的問題,保證了同一個事務中多次讀取同樣記錄的結果是是一致的。該隔離級別會產生幻讀,幻讀並不是兩次讀到的不一樣是幻讀,而是對這個事務後期的業務邏輯有影響的纔是幻讀。對於下面邊的例子中,對於事務A來說,查詢爲空,按理是可以插入的, 但是A提交之前B插入了id=1,導致A不能Insert,這就是幻讀A BEGIN select id from test //此時結果爲空 insert into test(id) value (1) commit //此時會報錯,主鍵重複 B BEGIN insert into test (id) value (1); COMMIT;會報**Duplicate entry ‘3’ for key ‘PRIMARY 主鍵重複’**該隔離級別爲mysql默認的。但是Innodb和XtraDB可以通過版本併發控制解決幻讀的問題。
    五、可串行話(SERIALIZABLE):是最高的隔離級別。可以避免可重複讀的幻讀現象,會在讀取的每一行數據上加鎖。該隔離級別會造成超時和鎖爭用的現象。一般情況下不會使用該隔離級別。
  4. 死鎖
    多個事務試圖以不同的順訊所內固定資源時或多個事務同時鎖定同一個資源時會產生死鎖。產生死鎖的原因是真正數據的衝突(通常很難避免),有一些則是由於存儲引擎的實現方式引起的。一般數據庫都實現了各種死鎖檢測和死鎖的超時機制。大多數情況下需要重新執行因死鎖回滾的事務即可。

引用於電子工業出版社出版的《高性能MySQL》一書

發佈了12 篇原創文章 · 獲贊 3 · 訪問量 6485
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章