MySQL InnoDB存儲引擎排它鎖和共享鎖的研究

1,共享鎖實驗

session1

在session1建表lisa並插入數據

mysql> create table lisa(name char(10),age int(5));

mysql> insert into lisa values('lisa','26');

加給age=26這一行加共享鎖

mysql> set autocommit=0;

mysql> select * from lisa where age=26 lock in share mode;

mysql> update lisa set age='99' where name = 'lisa';

更新成功!如下圖:

spacer.gifwKiom1hbhYPQw3D_AABOBg8_Qt0740.png-wh_50

session2

無法更新和查詢,如下所示:

wKioL1hbhanyGN7IAAAh6WHAXhQ023.png-wh_50

spacer.gif

總結: 在InnoDB存儲引擎中共享鎖和排它鎖是行鎖,必須使用where指定行再加鎖。

加共享鎖後,別的session無法更新和查詢。

2,排他鎖實驗

session2

在session1建表sun並插入數據

mysql> create table sun(name char(10),age int(4));

mysql> insert into sun values('lisa','26');

加給age=26這一行加排他鎖

mysql> set autocommit = 0;

mysql> select * from sun where age='26' for update;

mysql> update sun set name='winter' where age='26';

更新成功!如下圖:

spacer.gifwKiom1hbhcjAmO89AABIvR_1F_A125.png-wh_50


session3

在session3無法再給age=26這行加排它鎖,也無法更新age=26這行,並且查詢到的數據也不是session2中最新更新的數據。

spacer.gifwKioL1hbhemydZ41AABHxEwLQ-8208.png-wh_50



-----------------------------------------------------------------

在session2中建立新表tab_no_index並插入數據

mysql> create table tab_no_index(id int,name varchar(10)) engine=innodb;

mysql> insert into tab_no_index values(1,'1'),(2,'2'),(3,'3'),(4,'4');

mysql> set autocommit=0;

mysql> select * from tab_no_index where id=1;

mysql> select * from tab_no_index where id=1 for update;

給id=1這一行加排他鎖如下圖

spacer.gifwKiom1hbhgTAwGXhAABr8a8T8fY908.png-wh_50



在session1中查詢新表ab_no_index報錯啦!

mysql> select * from tab_no_index;
ERROR 1412 (HY000): Table definition has changed, please retry transaction

wKiom1hbhieRM-l7AABMGSs6O4A571.png-wh_50

spacer.gif


我所做的操作就是在該session1給表lisa加了行的共享鎖,

爲何我查詢別的表會報錯呢???

如何解決錯誤??


解決辦法:

mysql> commit;

spacer.gifwKiom1hbi9TxF4fhAABA1DarXDE506.png-wh_50


錯誤原因:

我創建表的事務隔離級別是可重複讀(repeatable-read),

不是讀提交(read-committed),在別的session查詢時需要commit或者rollback一下才能查到我更新的數據。就是第N次select跟第一次select的值都是一樣的,只有commit或者rollback等操作才能看到改變的值.

下圖是在創建表的session也就是本文的session2中做的操作

spacer.gifwKiom1hbi-2g0uChAAAwppS0x5o686.png-wh_50









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章