簡單理解mysql InnoDB的死鎖問題

2021-09-02 04:00:29 字數 2035 閱讀 2397

mysql三種鎖的級別:

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

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低

頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般

資料庫儲存引擎:

myisam和memory儲存引擎,採用的是表級鎖(table-level locking);

bdb儲存引擎,採用的是頁面鎖(page-level locking),但也支援表級鎖;

innodb儲存引擎,既支援行級鎖(row-level locking),也支援表級鎖,但預設情況下是採用行級鎖。

注意:innodb行級鎖是基於索引的,如果一條sql的條件欄位並沒有新增索引,則使用表級鎖

行級鎖加鎖順序:

如果一條sql語句操作了主鍵索引(primary key),mysql會鎖住主鍵索引;

如果一條sql語句操作了非主鍵索引(key),mysql會先鎖住非主鍵索引,再鎖定主鍵索引。

專案中死鎖關鍵報錯資訊:

### error updating database.  cause: com.mysql.jdbc.exceptions.jdbc4.mysqltransactionrollbackexception: deadlock found when trying to get lock; try restarting transaction

innodb可以通過如下命令來觀察鎖的情況:

select * from information_schema.innodb_trx; #檢視事務情況

select * from information_schema.innodb_locks; #檢視鎖情況

select * from information_schema.innodb_lock_waits; #檢視鎖等待情況

mysql/innodb死鎖產生示例:

新建乙個test表,結構如下,其中id為主鍵索引,aa為普通索引:

create table `test` (                    

`id` int(11) not null auto_increment,

`aa` varchar(50) default null,

`bb` varchar(50) default null,

`cc` varchar(50) default null,

primary key (`id`),

key `aa` (`aa`)

) engine=innodb default charset=utf8

--sql1:

update test set bb = '222' where aa = '11'

--sql2:

update test set aa = '111' where id = 1

根據死鎖示例進行分析:

首先sql1會先鎖住非主鍵索引aa,還需要鎖定主鍵索引id,與此同時

sql2直接鎖定主鍵索引id,而其中update語句中set還使用了aa,同時還需要鎖定非主鍵索引aa

因此兩條sql就出現了對索引資源的競爭,造成死鎖。

死鎖示例解決方案:

對sql1進行拆分,先根據條件查詢出資料,再根據資料id進行update

select * from test where aa = '11'

update test set bb = '222' where id in()

Mysql InnoDB 事務簡單理解

1.事務基本特性 acid a 由undo 來實現的 i 由鎖實現 d 由redo實現 c 由aid共同保證 2.undo 實現了 事務的回滾 以及 mvcc 事務的回滾 記錄下事務期間的所有update delete insert操作的前後value,當需要rollback時會做乙個相反的操作。m...

理解MySQL InnoDB事務隔離級別

本文為翻譯的文章,作者ovais.tariq,原文 隔離性是acid性質中很重要的部分,它保證事務以一種可靠的方式進行處理。隔離性確保同時執行的事務不會相互干擾。隔離性保證資料的一致性。如果事務沒有被隔離,那麼某個事務可能會修改其它事務正在讀取的資料,因而產生了資料的不一致。既然我們理解了隔離性是什...

MySQL InnoDB引擎B 樹索引簡單整理說明

本文出處 mysql中的innodb引擎表索引型別有一下幾種 以下所說的索引,沒有特殊說明,均指innodb引擎表索引。0 secondary index,二級索引,1 clustered index,聚集索引 2 unique index,唯一索引 3 primary index,主鍵索引 32 ...