對mysql的鎖這塊真的不是特別了解,學習完這一部分,有種豁然開朗的感覺。當然還是有待進一步提高。更加深入的學習。
mysql鎖的分類
1 表鎖,開銷小,加鎖快,不會出現死鎖,鎖定粒度大
2 行鎖,開銷大,加鎖慢,會出現死鎖,鎖粒度小
3 頁面鎖,介於兩者之間,會出現死鎖
myisam 表鎖,適合讀多的程式
innodb 行鎖,適合寫多和併發高的程式
檢視表鎖的狀況
show status like 'table%';
| table_locks_immediate | 504 |
| table_locks_waited | 0 鎖等待狀態 |
| table_open_cache_hits | 0 |
| table_open_cache_misses | 0 |
| table_open_cache_overflows | 0
表鎖又分為:表共享讀鎖,表獨佔寫鎖。
加表鎖語法:lock table *** read;lock table *** write;
解除表鎖:unlock tables;
併發插入
myisam的表讀寫都是序列的。其實也支援併發插入
通過concurent_insert 0 不允許 1 有空洞允許在表尾插入 2 允許表尾插入
myisam鎖排程
讀鎖寫鎖是互斥的,讀寫操作是序列的。myisam的鎖是寫先行。
當然也可以調整myisam的鎖的行為
innodb和myisam的最大的不同
1 innodb支援事務
2 採用了行鎖
事務和acid屬性
原子性。要麼全部執行,要麼全部不執行。
一致性。事務開始和完成時資料保持一致性。
隔離性。事務不受外部併發操作影響。
永續性。當事務完成後,資料的修改是永久性的
併發事務帶來的問題
更新丟失。多事務操作同一條記錄。可以採用鎖定。
髒讀。不可重複讀。
幻讀。
事務隔離級別
實現方式
1 加鎖
2 快照實現多版本控制
未提交讀
已提交讀
可重複讀
可序列化
檢視innodb事務狀態
show status like '%innodb%';
innodb的行鎖模式以及加鎖方式
行鎖
共享鎖s,允許乙個事務去讀一行,阻止其他事務獲取相同資料集的排它s鎖
排他鎖x,允許獲得排它鎖的事務更新資料,阻止其他事務獲取相同的共享鎖和排它鎖
表鎖 意向共享鎖is
意向排它鎖ix
innodb鎖的特別注意的
1 在不通過索引條件查詢的時候,innodb確實用的是表鎖,不是行鎖。
2 mysql的行鎖是針對索引加的鎖,而不是針對記錄,使用相同的索引鍵可能出現衝突。
3 當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引,唯一索引,普通索引,innodb都是採用行鎖來對資料加鎖
4 即使建立了索引,能偶否使用索引還是由mysql判斷,如果代價高,innodb可能採用表鎖。
間隙鎖-範圍加鎖
恢復機制對innodb鎖的影響
myslql是通過binlog記錄執行增刪改查操作的。
1 mysql恢復的是sql語句的集合
2 通過binglog先後順序恢復
innodb什麼時候使用表鎖
1 事務需要更新大部分或者全部資料,表又打的時候
2 實際多表,業務複雜,容易造成死鎖,造成大量事務回滾的情況。
在使用mysql中如何儘量減少死鎖的概率
盡量使用較低階別的隔離級別
精心設計索引,並盡量使用索引反問資料,使加鎖更加精確
合理選擇事務大小
申請合適的事務級別
如果不同的程式會併發訪問多個表,應盡量約定以相同的順序來訪問表。
批量處理資料時,先對資料排序,保證每個執行緒以固定的順序來訪問記錄
更新記錄直接使用排它鎖
更新同一條記錄可以採用read commited級別
MySQL學習筆記(二)函式篇之其他函式
說明 返回由屬於一組的列值連線組合而成的結果 常與關鍵字 group by 一起使用,能夠將分組後指定的字段值都顯示出來。例 使用group concat函式查詢不同 id下對應的所有 name資訊 原表 create tableusers idint 4 not null,namevarchar ...
mysql 優化之索引篇(一)
一 索引的優點 a.索引可以加快查詢速度 b.索引是最有效的查詢優化條件 c.使用索引可以不用全表掃瞄 二 索引的缺點 a.降低了寫入的速度 insert update 寫入時不僅要求寫入到資料行,還要更新全部索引 索引的建立原則 a.盡量為用來搜尋 分類或分組的資料列編制索引,不要為輸出顯示的列編...
golang學習筆記之併發優化(二)
通往管道的資料如果一次打包傳送的效能要高於多次傳送。請看下面裡面,這個裡面我往管道裡面傳送50000000次 func main close done for i 0 i 50000000 i close c done 結果如下 time go run mutilsend.go 1249999975...