由於對於mysql的鎖機制了解的並不深入,所以翻閱了資料,整理一下自己所理解的鎖。以mysql資料庫的innodb引擎為例,因為innodb支援事務、行鎖、表鎖;且現在大部分公司使用的都是innodb。
mysql鎖的使用離不開事務的,所以我們先上點簡單的理論,了解一下事務。
事務的基本要素(acid)
1.原子性(atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。
2.一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如a向b轉賬,不可能a扣了錢,b卻沒收到。
3.隔離性(isolation):同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如a正在從一張銀行卡中取錢,在a取錢的過程結束前,b不能向這張卡轉賬。
4.永續性(durability):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,不能回滾。
事務隔離級別
髒讀不可重複讀
幻讀讀未提交(read-uncommitted)是是
是不可重複讀(read-committed)否是
是可重複讀(repeatable-read)否否
是序列化(serializable)否否
否mysql預設的事務隔離級別為:可重複讀(repeatable-read)
mysql>
select
@@tx_isolation;
+
-----------------+
| @@tx_isolation |
+
-----------------+
|
repeatable
-
read
|
+
-----------------+
1 row
in
set
(0.00 sec)
大家可以參考這個文件,寫得簡單清晰:
共享鎖(s):允許乙個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。
排他鎖(x):允許獲得排他鎖的事務更新資料,阻止其他事務取得相同資料集的共享讀鎖和排他寫鎖。
意向共享鎖(is):事務打算給資料行加行共享鎖,事務在給乙個資料行加共享鎖前必須先取得該錶的is鎖。
意向排他鎖(ix):事務打算給資料行加行排他鎖,事務在給乙個資料行加排他鎖前必須先取得該錶的ix鎖。
說明:1)共享鎖和排他鎖都是行鎖,意向鎖都是表鎖,應用中我們只會使用到共享鎖和排他鎖,意向鎖是mysql內部使用的,不需要使用者干預。
2)對於update、delete和insert語句,innodb會自動給涉及資料集加排他鎖(x);
對於普通select語句,innodb不會加任何鎖,事務可以通過以下語句顯示給記錄集加共享鎖或排他鎖。
共享鎖(s):select * from table_name where ... lock in share mode。
排他鎖(x):select * from table_name where ... for update。
3)innodb行鎖是通過給索引上的索引項加鎖來實現的,因此innodb這種行鎖實現特點意味著:只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖!
參考文件:
環境配置:mysql:5.7.10 ,innodb引擎,事務隔離級別為:可重複讀(repeatable-read)
出處:
幾種鎖演算法的實現
4種lock的實現 每乙個lock帶有乙個狀態位,lock 與unlock 操作原子的改變狀態位。false時可進入,true時spin。public class taslock implements lock public void unlock defect taslock演算法的改進。publ...
IOS的幾種鎖 C
1.互斥鎖 互斥鎖在同一時刻只允許乙個執行緒訪問資源。include pthread mutex t mutex pthread mutex init mutex,null 初始化 或者這種方式初始化 pthread mutex t mutex pthread mutex initializer 對...
多執行緒的幾種鎖
所有鎖的前提是 synchronized 條件下 重入鎖 執行緒1 執行方法a,方法a中執行方法b,則產生重入鎖,即不需要等待獲取鎖 中斷鎖 reentrantlock 使用synchronized修飾的方法,在阻塞狀態blocked時不能被外部打斷,除非jvm報錯.使用reentrantlock中...