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