mybatis的幾種鎖

2021-08-29 21:03:01 字數 1996 閱讀 7707

由於對於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 rowinset(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中...