日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_手动加行级排他锁_行级写锁_行级独占锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。