SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁
生活随笔
收集整理的這篇文章主要介紹了
SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 介紹
- 加鎖情況分析
- 明確指定主鍵,并且數據真實存在,鎖定行
- 明確指定主鍵,但數據不存在,不加鎖
- 主鍵不明確,鎖定整個表
- 無主鍵,鎖定整個表
- 應用場景
介紹
1.FOR UPDATE 加的鎖是一種行級排他鎖,也是一種悲觀鎖
2.加鎖的事務可以查詢也可以修改被加鎖的數據行,其它事務只能查詢但不能修改被加鎖的數據行,而且其它事務不能再往這個數據行加任何類型的鎖
3.FOR UPDATE 給行加鎖,必須在事務控制模塊中才能生效
4.FOR UPDATE 僅適用于 InnoDB
5.MyISAM 只支持表級鎖,InnoDB 支持表級鎖和行級鎖
注:不顯式執行 START TRANSACTION,執行 DML 語句也是一個事務,默認自動提交。
什么時候釋放鎖:
1.執行提交或回滾語句
2.退出數據庫
3.程序停止運行
加鎖情況分析
查詢 InnoDB 表數據時,只有查詢條件中明確指定主鍵值,MySQL 才會鎖定行;否則 MySQL 將會鎖定整個表。
假設有下面這張表及數據:
mysql> select * from user; +----------------------+----------+ | id | NAME | +----------------------+----------+ | 00000000000000000001 | zhangsan | | 00000000000000000002 | lisi | | 00000000000000000003 | libai | +----------------------+----------+ 3 rows in set (0.00 sec)注:ID 是主鍵。
明確指定主鍵,并且數據真實存在,鎖定行
START TRANSACTION; -- 開始事務 SELECT * FROM user WHERE id=00000000000000000003 FOR UPDATE; SELECT * FROM user WHERE id=00000000000000000003 and name='lisi' FOR UPDATE;明確指定主鍵,但數據不存在,不加鎖
SELECT * FROM user WHERE id=0 FOR UPDATE;主鍵不明確,鎖定整個表
SELECT * FROM user WHERE id<>3 FOR UPDATE; SELECT * FROM user WHERE id LIKE '%3%' FOR UPDATE;注意:不管是否查詢到記錄,都會鎖定表。
無主鍵,鎖定整個表
SELECT * FROM user WHERE name='libai' FOR UPDATE;應用場景
比如火車票訂票,在手機屏幕上顯示有票,如果沒有鎖定相關數據,在真正進行出票(扣減鎖票)時,你必須重新確定一下這個數據有沒有被其他客戶端修改過。如果你使用了行級鎖,則可以直接出票,所以這個業務場景可以使用 FOR UPDATE 對數據進行加鎖。
總結
以上是生活随笔為你收集整理的SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓fm2022(安卓fmh)
- 下一篇: (beats连安卓)