<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在專案中,我們經常使用到update
語句,那麼update
語句會鎖定表中的那些記錄呢?此處我們通過一些簡單的案例來模擬下。此處是我自己的一個理解,如果那個地方理解錯了,歡迎指出
mysql> show variables like 'transaction_isolation'; +-----------------------+-----------------+ | Variable_name | Value | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.28 | +-----------+ 1 row in set (0.00 sec)
mysql> show variables like '%storage_engine%'; +---------------------------------+-----------+ | Variable_name | Value | +---------------------------------+-----------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_mem_storage_engine | TempTable | +---------------------------------+-----------+ 4 rows in set (0.01 sec)
鎖是加在索引上
,那如果表中沒有建立索引,是否就是加在表上的呢?其實不是,也是加在索引的,會存在一個預設的。
Record locks always lock index records, even if a table is defined with no indexes. For such cases, InnoDB creates a hidden clustered index and uses this index for record locking
參考連結: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
UPDATE ... WHERE ... sets an exclusive next-key lock on every record the search encounters
此處可以理解加鎖的單位是: next-key
鎖
2.6.1 Record Locks
記錄鎖
,即只會鎖定一條記錄。其實是鎖定這條記錄的索引。
A record lock is a lock on an index record. For example, SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; prevents any other transaction from inserting, updating, or deleting rows where the value of t.c1 is 10.
2.6.2 Gap Locks
間隙鎖
,間隙鎖是在索引記錄之間的間隙上的鎖,即鎖定一個區間。前開後開區間
,不包括記錄本身。
間隙鎖
如果是使用單列唯一索引值
進行更新的話,是會退化
成Record Lock
。
間隙鎖的目的
:
Gap locking is not needed for statements that lock rows using a unique index to search > for a unique row. (This does not include the case that the search condition includes only > some columns of a multiple-column unique index; in that case, gap locking does occur.)
2.6.3 Next-Key Locks
Next-Key Lock 是索引記錄上
的記錄鎖
和索引記錄之前
的間隙上的間隙鎖
的組合。也是鎖定一個區間,前開後閉區間
。包括記錄本身。
如果索引值包括 1,5,10,30
,那麼next key 鎖可能涵蓋如下區間
(negative infinity, 1] (1, 115 (5, 10] (10, 30] (30, positive infinity)
negative infinity
指的是負無窮。positive infinity
指的是正無窮。
2.6.4 測試鎖表的表結構
create table test_record_lock ( id int not null comment '主鍵', age int null comment '年齡,普通索引', name varchar(10) null comment '姓名,無索引', constraint test_record_lock_pk primary key (id) ) comment '測試記錄鎖'; create index test_record_lock_age_index on test_record_lock (age);
2.6.5 表中的測試資料
mysql> select * from test_record_lock; +----+------+--------+ | id | age | name | +----+------+--------+ | 1 | 10 | 張三 | | 5 | 20 | 李四 | | 8 | 25 | 王五 | +----+------+--------+ 3 rows in set (0.00 sec)
2.7 檢視資料庫中當前的鎖
select * from performance_schema.data_locks;
欄位解釋:
欄位 | 值 | 解釋 |
---|---|---|
lock_type | TABLE | 鎖是加在表上 |
RECORD | 鎖加在記錄上 | |
lock_mode | IX | 意向排他鎖 |
X或者S | next-key lock 鎖定記錄本身和記錄之前的間隙 | |
X,REC_NOT_GAP | Record Lock 只鎖記錄自身 | |
S,REC_NOT_GAP | Record Lock 只鎖記錄自身 | |
X,GAP | gap lock | |
X,INSERT_INTENTION | 插入意向鎖 | |
lock_data | 具體的某個數位 | 表示主鍵的值 |
值,值 | 第一個值:普通索引的值 第二個值:主鍵值 |
疑問:X,GAP
是否可以理解成X
鎖退化成了GAP
鎖。
此處適用單個欄位的唯一索引,不適合多個欄位的唯一索引
3.1.1 等值更新-記錄存在
解釋:
加next-key lock,那麼鎖定的記錄範圍為 (1,5]。
因為是唯一索引,且查詢的值存在,next-key lock退化成record lock,即最終只鎖定了id=5的這一行資料。其餘的資料不影響。
3.1.2 等值查詢-記錄不存在-01
解釋:
3.1.3 等值更新-記錄不存在-02
3.1.4 範圍更新
1、小於或等於最大臨界值
此時可以發現表中掃描到的記錄都加上了next key lock(鎖加在索引上)
2、大於或等於最小臨界值
mysql> begin; Query OK, 0 rows affected (0.01 sec) mysql> update test_record_lock set name = 'aaa' where id >= 1; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> select LOCK_TYPE,INDEX_NAME,LOCK_MODE,LOCK_DATA from performance_schema.data_locks; +-----------+------------+---------------+------------------------+ | LOCK_TYPE | INDEX_NAME | LOCK_MODE | LOCK_DATA | +-----------+------------+---------------+------------------------+ | TABLE | NULL | IX | NULL | | RECORD | PRIMARY | X,REC_NOT_GAP | 1 | | RECORD | PRIMARY | X | supremum pseudo-record | | RECORD | PRIMARY | X | 8 | | RECORD | PRIMARY | X | 5 | +-----------+------------+---------------+------------------------+ 5 rows in set (0.01 sec)
此時只可向表中插入比最小臨界值小的記錄。
3、正常範圍
3.2.1 等值更新-記錄存在
解釋:
age
加上next-key lock,鎖定的範圍是(10,20]3.2.2 等值更新-記錄不存在
解釋:
3.2.3 範圍更新
解釋:
普通索引的範圍更新,next-key-lock不回退化成 gap lock。
從上圖中可知,無索引更新資料表危險,需要謹慎處理
。無索引更新,會導致全表掃描,導致將掃描到的所有記錄都加上next-key lock
。
1、https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
2、https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
到此這篇關於淺談MySql update會鎖定哪些範圍的資料的文章就介紹到這了,更多相關MySql update鎖定範圍內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45