mysql的innodb引擎鎖的原理是怎樣的,來做個試驗。
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.20 |
+-----------+
1 row in set (0.00 sec)
create table test
(a int(5),
b varchar(10),
c varchar(10)
);insert into test values(1,'111','111');
insert into test values(2,'222','222');
insert into test values(3,'333','333');
insert into test values(4,'444','444');
insert into test values(5,'555','555');
insert into test values(6,'666','666');
commit;
mysql> select * from test;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 111 | 111 |
| 2 | 222 | 222 |
| 3 | 333 | 333 |
| 4 | 444 | 444 |
| 5 | 555 | 555 |
| 6 | 666 | 666 |
+------+------+------+
6 rows in set (0.00 sec)
在cmd視窗完成實驗,需要設定set autocommit=off;
1.在沒有主鍵的情況下,修改不同的一條記錄
session1:
mysql> update test set b='111' where a=1;
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
session2:
mysql> update test set b='222' where a=2;--先是hang住,過段時間後就報錯
error 1205 (hy000): lock wait timeout exceeded; try restarting transaction
2.在沒有主鍵的情況下,新增一條資料,然後修改另一條資料
session1:
mysql> insert into test values(7,'777','777');
query ok, 1 row affected (0.00 sec)
session2:
mysql> update test set b='222' where a=2;--先是hang住,過段時間後就報錯
error 1205 (hy000): lock wait timeout exceeded; try restarting transaction
3.在有主鍵的情況下,修改不同的一條記錄
alter table test add primary key(a);
當有主鍵時沒有產生鎖全表的情況
session1:
mysql> update test set b='111' where a=1;
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
session2:
mysql> update test set b='222' where a=2;
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
當有主鍵時修改同一條記錄,會hang住,說明就是行鎖
session1:
mysql> update test set b='111' where a=1;
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
session2:
mysql> update test set b='111' where a=1;
error 1205 (hy000): lock wait timeout exceeded; try restarting transaction
4.在有主鍵的情況下,insert和update
session1:
mysql> insert into test values(8,'888','888');
query ok, 1 row affected (0.00 sec)
session2:
mysql> update test set b='111' where a=1;
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
5.在沒有索引的情況下,修改不同的一條記錄
session1:
mysql> update test set c='111' where b='111';
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
session2:
mysql> update test set c='222' where b='222';
error 1205 (hy000): lock wait timeout exceeded; try restarting transaction
6.在有索引的情況下,修改不同的一條記錄
create index ind_t_b on test(b);
session1:
mysql> update test set c='111' where b='111';
query ok, 0 rows affected (0.00 sec)
rows matched: 1 changed: 0 warnings: 0
session2:
mysql> update test set c='222' where b='222';
query ok, 0 rows affected (0.01 sec)
rows matched: 1 changed: 0 warnings: 0
總結:當用到了索引(同時我也測試了建了索引沒有用到的情況,還是行鎖),則是行鎖,否則鎖全表,沒有oracle中的行鎖方便。
MySql鎖與InnoDB引擎
表鎖和行鎖的區別 mysql的表級鎖有兩種 元資料鎖和表鎖。表鎖的兩種形式 元資料鎖 mysql的行級鎖是有儲存引擎實現的,mysql現在預設的資料引擎為innodb。本文主要介紹innodb的行鎖 innodb的行鎖是給索引項加鎖實現的,也就意味著只有使用索引檢索的資料才能使用行鎖,否則將使用表鎖...
MySql儲存引擎InnoDB的鎖
innodb實現了以下兩種型別的行鎖 共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,阻止其他事務獲得相同資料集的共享鎖和排他鎖。共享鎖就是我讀的時候,你可以讀,但是不能寫。排他鎖就是我寫的時候,你不能讀也不能寫。另外,為了允許行鎖和...
Mysql中InnoDB引擎的鎖
鎖這種機制的作用 對共享資源併發訪問的管理,保證資料的完整性和一致性。在資料庫中,lock與latch都可以被稱為 鎖 但是兩者的含義是完全不同的。lock針對的物件是事務,它用來鎖定資料庫中的物件,如表 頁 行。一般lock的物件僅在事務commit或者rollback後進行釋放,並且lock是有...