1.測試資料準備
create table `test` (2.共享鎖(s鎖,myisam 叫做讀鎖)新增方式:select … lock in share mode`id` bigint(11) unsigned not null auto_increment comment '主鍵',
`a` int(11) not null,
`b` int(11) not null,
primary key (`id`),
key `idx_a` (`a`)
) engine=innodb auto_increment=1 default charset=utf8mb4;
insert into `test` (`id`, `a`, `b`)
values
(1, 5, 1),
(2, 10, 2),
(3, 15, 3),
(4, 20, 4),
(5, 25, 5);
select * from test where id = 1 lock in share mode;
說明:事務a中新增共享鎖後,事務a可對資料進行讀寫操作,其他事務可對資料進行讀操作或也新增共享鎖。若事務ab同時使用共享鎖。那麼事務ab都不能對該資料進行寫操作。
測試場景一:更新阻塞。a事務新增共享鎖,b事務進行讀、寫操作
事務a事務b
說明begin;
begin;
開啟事務
select * from test where id = 1 lock in share mode;
事務a,新增共享鎖
select * from test where id = 1;
事務b,查詢成功(見2.1)
update test set b = 100 where id = 1;
事務b,update操作阻塞(見2.2)
commit;
事務a提交事務後,釋放鎖;
事務b update成功。
commit;
2.1 事務b,可查詢
2.2 事務b update操作阻塞
測試場景二:死鎖
。事務a新增共享鎖,事務b也新增共享鎖,事務a進行更新操作,事務b也進行更新操作
事務a事務b
說明begin;
begin;
開啟事務
select * from test where id = 1 lock in share mode;
事務a,新增共享鎖
select * from test where id = 1 lock in share mode;
事務b,新增共享鎖成功(見2.3)
update test set b = 100 where id = 1;
事務a,進行update操作阻塞(見2.4)
update test set b = 101 where id = 1;
事務b,進行update操作,發生死鎖,丟擲異常(deadlock found when trying to get lock; try restarting transaction),事務回滾並釋放鎖(見2.5);
事務a,update更新成功
commit;
2.3 事務b新增共享鎖成功
2.4 事務a,進行update操作阻塞
2.5 事務b,進行update操作,發生死鎖
排它鎖(x鎖,myisam 叫做寫鎖)
新增方式:select … for update;
select * from test where id = 1 for update;
說明:update,delete,insert 操作會自動新增排他鎖,新增排他鎖後,不能再新增其他的鎖。事務a中新增排它鎖。事務a可對資料進行讀寫操作。事務b只能對資料進行讀操作。
測試場景一:新增其他的鎖等待。事務a新增排它鎖,事務b也新增排它鎖或共享鎖。
事務a事務b
說明begin;
begin;
select * from test where id = 1 for update;
事務a,新增排他鎖
select * from test where id = 1 lock in share mode;
事務b,新增共享鎖,等待(見3.1)
commit;
事務a,提交事務,釋放鎖;
事務b,新增鎖成功
commit;
圖3.1 事務b新增,共享鎖(或排它鎖)等待
共享鎖與排它鎖
根據自己理解,物件指行或者表 共享鎖 s鎖 又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。排他鎖 x鎖 又稱寫鎖。若事務t對資料物件a加上x鎖,...
共享鎖與排它鎖
共享鎖 s鎖 又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。排他鎖 x鎖 又稱寫鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其...
共享鎖與排它鎖
共享鎖 s鎖 又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。排他鎖 x鎖 又稱寫鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其...