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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java mysql 行锁_Java如何实现对Mysql数据库的行锁?

發布時間:2023/12/31 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java mysql 行锁_Java如何实现对Mysql数据库的行锁? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

行鎖

mysql實現行級鎖的兩大前提就是,innodb引擎并且開啟事務。由于MySQL/InnoDB的加鎖分析,一般日常中使用方式為: select .... from table where ..... for update 語句并且在 Repeatable Read 事務隔離級別下。

行鎖的劣勢:開銷大;加鎖慢;會出現死鎖

行鎖的優勢:鎖的粒度小,發生鎖沖突的概率低;處理并發的能力強

加鎖的方式:自動加鎖。對于UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖;對于普通SELECT語句,InnoDB不會加任何鎖;當然我們也可以顯示的加鎖:

共享鎖:select * from table where “條件” + lock in share more

排他鎖:select * from table where ”條件“ + for update

MySQL 事務屬性

事務是由一組SQL語句組成的邏輯處理單元,事務具有ACID屬性。

原子性(Atomicity):事務是一個原子操作單元。在當時原子是不可分割的最小元素,其對數據的修改,要么全部成功,要么全部都不成功。 一致性(Consistent):事務開始到結束的時間段內,數據都必須保持一致狀態。 隔離性(Isolation):數據庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的”獨立”環境執行。 持久性(Durable):事務完成后,它對于數據的修改是永久性的,即使出現系統故障也能夠保持。 舉例說明

innodb引擎中行級鎖分為以下三種鎖

1.Record Lock

單個行記錄上的鎖

2.Gap Lock

間隙鎖,鎖定一個范圍,不包括記錄本身

3.Next-Key Lock

鎖定一個范圍和記錄本身

話不多說直接代碼開干

代碼:select * from table where order_no= '20200521xxx' for update;

order_no是主鍵的時候,可以確定唯一一條數據, 所以在此加上Record Lock(即為單個記錄上鎖)

order_no是普通索引的時候,innodb層面 會根據條件鎖定一個范圍,在查詢的時候聚簇索引上加Record Lock(即為單個記錄上鎖)

order_no不是索引的時候,本條sql會進行全表掃描,會在所有的聚簇索引上加鎖,相當于全表鎖,這個是在mysql innodb引擎層面決定。

還有一種情況,假如后面跟多個情況

代碼:select * from table where order_no= '20200521' and code='xxx' for update;

經過上面分析

order_no主鍵,code不是索引,查詢都只有一條數據,加Record Lock

order_no 普通索引,code不是索引 ,會先掃描order_no= '20200521',范圍下加鎖

結論:我們的for update 并不時都鎖一條記錄,也并不是只有一個鎖,但是也包含我們常用的手段了,在項目中可以實踐用用哦

總結

以上是生活随笔為你收集整理的java mysql 行锁_Java如何实现对Mysql数据库的行锁?的全部內容,希望文章能夠幫你解決所遇到的問題。

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