mysql鎖機制之行級鎖

2021-08-28 19:16:09 字數 4704 閱讀 5026

鎖是在執行多執行緒時用於強行限定資源訪問的同步機制,資料庫鎖根據鎖的粒度可分為行級鎖,表級鎖和頁級鎖

行級鎖

行級鎖是mysql中粒度最細的一種鎖機制,表示只對當前所操作的行進行加鎖,行級鎖發生衝突的概率很低,其粒度最小,但是加鎖的代價最大。行級鎖分為共享鎖和排他鎖。

特點:

開銷大,加鎖慢,會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最大,併發性也高;

實現原理:

innodb行鎖是通過給索引項加鎖來實現的,這一點mysql和oracle不同,後者是通過在資料庫中對相應的資料行加鎖來實現的,innodb這種行級鎖決定,只有通過索引條件來檢索資料,才能使用行級鎖,否則,直接使用表級鎖。特別注意:使用行級鎖一定要使用索引

舉個栗子:

建立表結構

create table `developerinfo` (

`userid` bigint(20) not null,

`name` varchar(255) default null,

`password` varchar(255) default null,

primary key (`userid`),

key `password_index` (`password`) using btree

) engine=innodb default charset=utf8;

插入資料

insert into `developerinfo` values ('1', 'liujie', '123456');

insert into `developerinfo` values ('2', 'yitong', '123');

insert into `developerinfo` values ('3', 'tong', '123456');

(1)通過主鍵索引來查詢資料庫使用行鎖

開啟三個命令列視窗進行測試

命令列視窗1

命令列視窗2

命令列視窗3

mysql> set autocommit = 0;

query ok, 0 rows affected

mysql> select * from developerinfo where userid = '1' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      1 | liujie | 123456   |

+--------+--------+----------+

1 row in set

mysql> set autocommit = 0;

query ok, 0 rows affected mysql> select * from developerinfo where userid = '1' for update;

等待mysql> set autocommit = 0;

query ok, 0 rows affected

mysql> select * from developerinfo where userid = '3' for update;

+--------+------+----------+

| userid | name | password |

+--------+------+----------+

|      3 | tong | 123456   |

+--------+------+----------+

1 row in set

mysql> commit;

query ok, 0 rows affected

mysql> select * from developerinfo where userid = '1' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      1 | liujie | 123456   |

+--------+--------+----------+

1 row in set

(2)查詢非索引的字段來查詢資料庫使用行鎖

開啟兩個命令列視窗進行測試

命令列視窗1

命令列視窗2

mysql> set autocommit=0;

query ok, 0 rows affected

mysql> select * from developerinfo where name = 'liujie' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      1 | liujie | 123456   |

+--------+--------+----------+

1 row in set

mysql> set autocommit=0;

query ok, 0 rows affected

mysql> select * from developerinfo where name = 'tong' for update; 等待

mysql> commit;

query ok, 0 rows affected

mysql> select * from developerinfo where name = 'liujie' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      1 | liujie | 123456   |

+--------+--------+----------+

1 row in set

(3)查詢非唯一索引欄位來查詢資料庫使用行鎖鎖住多行

mysql的行鎖是針對索引假的鎖,不是針對記錄,所以可能會出現鎖住不同記錄的場景

開啟三個命令列視窗進行測試

命令列視窗1

命令列視窗2

命令列視窗3

mysql> set autocommit=0;

query ok, 0 rows affected

mysql> select * from developerinfo where password = '123456

' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      1 | liujie | 123456   |

|      3 | tong   | 123456   |

+--------+--------+----------+

2 rows in set

mysql> set autocommit =0 ;

query ok, 0 rows affected mysql> select * from developerinfo where userid = '1' for update;

等待mysql> set autocommit = 0;

query ok, 0 rows affected

mysql> select * from developerinfo where userid = '2

' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      2 | yitong | 123      |

+--------+--------+----------+

1 row in set

commit;

mysql> select * from developerinfo where userid = '1' for update;

+--------+--------+----------+

| userid | name   | password |

+--------+--------+----------+

|      1 | liujie | 123456   |

+--------+--------+----------+

1 row in set

(4)條件中使用索引來操作檢索資料庫時,是否使用索引還需有mysql通過判斷不同執行計畫來決定,是否使用該索引,如需判定如何使用explain來判斷索引,請聽下回分解

MySQL鎖的用法之行級鎖

行級鎖是mysql中粒度最小的一種鎖,他能大大減少資料庫操作的衝突。但是粒度越小,實現的成本也越高。myisam引擎只支援表級鎖,而innodb引擎能夠支援行級鎖,下面的內容也是針對innodb行級鎖展開的。innodb的行級鎖有共享鎖 s lock 和排他鎖 x lock 兩種。共享鎖允許事物讀一...

MySQL鎖的用法之行級鎖

行級鎖是mysql中粒度最小的一種鎖,他能大大減少資料庫操作的衝突。但是粒度越小,實現的成本也越高。myisam引擎只支援表級鎖,而innodb引擎能夠支援行級鎖,下面的內容也是針對innodb行級鎖展開的。innodb的行級鎖有共享鎖 s lock 和排他鎖 x lock 兩種。共享鎖允許事物讀一...

MySQL鎖的用法之行級鎖

行級鎖是 mysql 資料庫 中粒度最小的一種鎖,他能大大減少 資料庫 操作的衝突。但是粒度越小,實現的成本也越高。myisam 引擎只支援表級鎖,而 innodb 引擎能夠支援行級鎖,下面的內容也是針對innodb行級鎖展開的。innodb的行級鎖有共享鎖 s lock 和排他鎖 x lock 兩...