mysql事物鎖鎖表 mysql 事務 行鎖 表鎖

2021-10-18 21:54:55 字數 2597 閱讀 6647

一、準備:

select * from information_schema.innodb_trx ; //查詢事務

select * from information_schema.innodb_locks; //查詢鎖

select * from information_schema.innodb_lock_waits; //暫時不用

show status like 『innodb_row_lock%』; //暫時不用

show open tables where in_use > 0; //檢視鎖表,用來dump資料,不是表級鎖//

show processlist //檢視正在執行的程序。最重要的一列:state()

建表語句

create table `user` (

`id` int(11) not null auto_increment,

`name` varchar(255) not null,

`ordernum` varchar(255) not null,

`mobile` varchar(255) not null,

primary key (`id`),

unique key `un_name` (`name`) using btree

) engine=innodb auto_increment=8 default charset=utf8;

insert into `user` values ('2', 'a', '1', '131');

insert into `user` values ('4', 'b', '2', '132');

insert into `user` values ('6', 'c', '3', '186');

二、測試

使用命令mysql -hx.x.x.x -uroot -p123456 開啟連線a,b

連線a:

begin; //查詢事務:無

select * from user for update; //查詢事務:1個;查詢鎖:無

表太寬,下面兩個圖是一條記錄:

連線b:

begin;

select * from user for update; //查詢事務:2個;鎖:2個, 如下圖

連線b:等待超時

error 1205 (hy000): lock wait timeout exceeded; try restarting transaction

再次查詢事務:2個;鎖:0個

連線b: commit; //b事務結束,只剩下a事務。

三、測試:行級鎖,表級鎖

1、使用索引,行級鎖

連線a:

begin;

update user set ordernum=3 where id = 2;

連線b:

select * from user where id=4 for update; //不阻塞

select * from user where id=2 for update; //阻塞。但是連線a只鎖了一行,如下圖

2、不使用索引,表級鎖

連線a:

begin;

update user set ordernum=3 wheremobile=』131』;

連線b:

select * from user where id=4 for update; //阻塞

select * from user where id=2 for update; //阻塞。連線a只鎖了4行,如下圖

3、其他測試

連線a:

begin;

update user set ordernum=2 where mobile like 『13%』; //b會阻塞

//update user set ordernum=2; //效果同上。

//select count(*) from user for update; //效果同上

//select count(*) from user; //不會阻塞連線b的for update查詢

連線b:

select * from user for update;

select * from user //非for update查詢永不阻塞。

排它鎖 for update

共享鎖 lock in share mode

四、鎖表,用來dump資料等,不是表級鎖

鎖表連線a: lock tables user write; // show open tables where in_use > 0; 下圖

連線b: update user set ordernum=2; //阻塞

連線a: unlock tables;

連線b: 阻塞消除

mysql事物中行鎖與表鎖

事物與鎖 什麼叫不支援事物 首先要了解資料庫裡的事務是什麼意思。事務在計算機資料庫裡 在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 在關聯式資料庫中,乙個事務可以是一條sql語句,一組sql語句或整個程式。簡單的講 舉例來說 a 匯100塊錢給 b,a 減少100 ...

Mysql 鎖和事物

1.共享鎖 讀鎖 讀鎖允許多個連線可以同一時刻併發的讀取同一資源,互不干擾 2.排他鎖 寫鎖 寫鎖會阻塞其他的寫鎖或讀鎖,保證同一時刻只有乙個連線可以寫入資料,同時防止其他使用者對這個資料的讀寫 3.鎖策略 保證了執行緒安全的同時獲取最大的效能之間的平衡策略,因為鎖的開銷是較為昂貴的 a.表鎖 my...

mysql鎖表測試 mysql 行鎖,表鎖 測試

環境 mysql5.5,引擎innodb,sqlyog 行鎖,表鎖區別 其實就是看where後面的條件是否有有索引,有索引的時候就是行鎖,沒有索引的時候就是表索。先建立表結構 create table lock test id int 11 not null auto increment,name ...