mysql有三種鎖的級別:頁級、表級、行級。
myisam和memory儲存引擎採用的是表級鎖(table-level locking);bdb儲存引擎採用的是頁面鎖(page-level
locking),但也支援表級鎖;innodb儲存引擎既支援行級鎖(row-level locking),也支援表級鎖,但預設情況下是採用行級鎖。
mysql這3種鎖的特性可大致歸納如下:
表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。
示例1:
-- 按行獲取行鎖
-- 獲取主鍵的共享鎖
insert into logging_exceptionlog_history_id_2 select * from logging_exceptionlog_history_id;
-- 獲取主鍵的互斥鎖
delete from logging_exceptionlog_history_id where id > 100 and id < 1000;
show engine innodb status; 檢視innodb引擎狀態,可檢視最近的死鎖情況
示例2:
表t1create table `t1` (
`id` int(11) not null auto_increment,
`name` varchar(64) default null,
`age` int(11) default null,
`posttime` timestamp null default current_timestamp on update current_timestamp,
primary key (`id`)
) engine=innodb auto_increment=2 default charset=utf8;
會話1-- 全域性的自動提交設為0,即不自動提交,然後另開乙個會話查詢autocommit狀態,當前會話可能還沒起作用
set global autocommit = 0;
會話2-- 另開乙個會話查詢autocommit狀態
show variables like '%autocommit%';
-- 插入一條記錄
insert into t1(name, age) values('***', 23);
會話3show variables like '%autocommit%';
-- 使用共享鎖查詢表,注意一定要加上 lock in share mode,否則不會出現死鎖
select * from t1 lock in share mode;
檢視select * from innodb_lock_waits;
連線查詢, 只需要使用這個sql即可查詢上述三表的資訊
select a.requesting_trx_id, c.lock_mode as wait_lock_mode,
c.lock_type as wait_lock_type, c.lock_table as wait_lock_table,
c.lock_index as wait_lock_index, c.lock_data as wait_lock_data,
e.trx_state as wait_trx_state, e.trx_query as wait_trx_query,
a.blocking_trx_id,b.lock_mode as block_lock_mode, b.lock_type as block_lock_type,
b.lock_table as block_lock_table, b.lock_index as block_lock_index, b.lock_data as block_lock_data,
d.trx_state as block_trx_state, d.trx_query as block_trx_query
from information_schema.innodb_lock_waits a
inner join information_schema.innodb_locks b on a.blocking_lock_id = b.lock_id
inner join information_schema.innodb_locks c on a.requested_lock_id = c.lock_id
inner join information_schema.innodb_trx d on a.blocking_trx_id = d.trx_id
inner join information_schema.innodb_trx e on a.requesting_trx_id = e.trx_id
mysql 壓力 死 MySQL死鎖
死鎖產生 死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈。當事務試圖以不同的順序鎖定資源時,就可能產生死鎖。多個事務同時鎖定同乙個資源時也可能會產生死鎖。檢測死鎖 資料庫系統實現了各種死鎖檢測和死鎖超時的機制。innodb儲存引擎能檢測到死鎖的迴圈依賴並立即返...
mysql 死鎖模擬 Mysql的死鎖
專案經常會出現mysql的死鎖問題,當年年少總是想通過select from information schema.innodb locks 檢視被鎖的事務,然後kill掉他,或者重啟mysql,唉,治標不治本啊,下次還會出現這些問題,其實造成死鎖大多數情況就是我們的sql寫的不大好。我們先來模擬一...
mysql怎麼模擬死鎖 mysql 模擬產生死鎖
場景描述 在update表的時候出現deadlockloserdataacces ception異常 deadlock found when trying to get lock try restarting transaction.問題分析 這個異常並不會影響使用者使用,因為資料庫遇到死鎖會自動回...