mysql的INNODB引擎鎖的原理試驗

2021-12-30 00:12:21 字數 3585 閱讀 5723

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是有...