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';
更新成功!如下圖:
session2
無法更新和查詢,如下所示:
總結: 在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';
更新成功!如下圖:
session3
在session3無法再給age=26這行加排它鎖,也無法更新age=26這行,並且查詢到的數據也不是session2中最新更新的數據。
-----------------------------------------------------------------
在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這一行加排他鎖如下圖
在session1中查詢新表ab_no_index報錯啦!
mysql> select * from tab_no_index;
ERROR 1412 (HY000): Table definition has changed, please retry transaction
我所做的操作就是在該session1給表lisa加了行的共享鎖,
爲何我查詢別的表會報錯呢???
如何解決錯誤??
解決辦法:
mysql> commit;
錯誤原因:
我創建表的事務隔離級別是可重複讀(repeatable-read),
不是讀提交(read-committed),在別的session查詢時需要commit或者rollback一下才能查到我更新的數據。就是第N次select跟第一次select的值都是一樣的,只有commit或者rollback等操作才能看到改變的值.
下圖是在創建表的session也就是本文的session2中做的操作