共享鎖與排它鎖

2022-07-08 02:30:13 字數 2969 閱讀 6939

1.測試資料準備

create table `test` (

`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);

2.共享鎖(s鎖,myisam 叫做讀鎖)新增方式:select … lock in share mode

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,其...