一、問題
create table `mchopin` (
`id` bigint unsigned not null auto_increment comment '主鍵',
`code` varchar(64) not null comment '使用者code',
`name` varchar(25) not null comment '姓名',
`age` int not null comment '年齡',
primary key (id),
unique key `idx_code` (code),
key `idx_name` (name))
default charset=utf8 comment='使用者表';
以下語句加了哪些鎖:
update mchopin set age = 11 where id = 10;
update mchopin set age = 11 where code = '***x';
update mchopin set age = 11 where name = 'jack';
update mchopin set age = 11 where age = 12;
tips:考慮不同隔離級別下的聚簇索引和二級索引的加鎖
二、加鎖分析
1️⃣以下幾個 case 中,資料庫的隔離級別是 read committed(rc)
主鍵update mchopin set age = 11 where id = 10;對id=10的資料上加x鎖
唯一索引
update mchopin set age = 11 where code = '***x';索引記錄加x鎖 && 對應行加x鎖
非唯一索引
update mchopin set age = 11 where name = 'jack';索引記錄加x鎖 && 對應行加x鎖。與唯一索引比,這裡可能會加多行的鎖。
無索引update mchopin set age = 11 where age = 12;全表掃瞄,對全表資料行加鎖。既不是表鎖,也不是只對符合要求的行加鎖。mysql 中,如果乙個條件無法通過索引快速過濾,那麼儲存引擎層面就會將所有記錄加鎖後返回,然後由 mysql server層進行過濾。
2️⃣以下幾個 case 中,資料庫的隔離級別是 repeatable read(rr)
主鍵update mchopin set age = 11 where id = 10;與 rc 的一致。
唯一索引
update mchopin set age = 11 where code = '***x';與 rc 的一致。
非唯一索引
update mchopin set age = 11 where name = 'jack';與 rc 的相比,索引上增加了 gap 鎖。這也是 rr 能保證不出現幻讀的關鍵。
無索引update mchopin set age = 11 where age = 10;每條記錄加x鎖,記錄之間加 gap 鎖。
mysql鎖的操作 MySQL的鎖操作
mysql innodb引擎中鎖的介紹 1.共享鎖 允許事務讀一行資料 2.排他鎖 允許事務刪除或者更新一行資料 3.意向共享鎖 事務想要獲得表中某幾行的共享鎖,是表級鎖 4.意向排他鎖 事務想要表中某幾行的排他鎖 查詢鎖資訊的方法 檢視當前請求鎖定的資訊 show engine innodb st...
mysql的悲觀鎖 mysql悲觀鎖
1.create database lock test db 2.create user test 1 identified by 123456 3.grant all privileges on lock test db.to test 1 identified by 123456 4.flush...
mysql間隙鎖 mysql的間隙鎖
最近學習了mysql的各種鎖,有點暈,打算通過文章的方式捋一捋。在學習了mvcc後,我就想,他已經很好的解決了併發讀寫了,但我也知道innodb提供了多種型別的鎖,所以很好奇這些鎖有什麼用,為什麼這些鎖的功能是mvcc做不到的?本文討論的都是rr級別下的鎖 我先建立乙個表,並插入幾行資料,如下圖 插...