undo log
binlog
併發事務的問題
事務隔離級別鎖死鎖
多版本併發控制,mvcc就是通過「讀取舊版本資料」來降低併發事務的鎖衝突,提高任務的併發度。
mvcc底層通過了redo和undo日誌來保證innodb事務的acid特性。
其中:redolog的寫入策略
binlog的寫入機制
快照讀:讀取回滾段中的資料,也就是歷史資料的快照,這些資料是不會被修改的。
讀到了未提交事務操作的記錄,例子如下:
-- 事務1,注意該事務沒有提交
insert
into
table
values
('a'
)-- 事務2,如果這是讀取到了事務1中的記錄,就是髒讀。
select
*from
table
乙個事務內相同的查詢,得到了不同的結果,例子如下
--事務1先執行select,得到結果value = "old"
select
*from
table
where id =
1--事務2執行之後直接提交
update
table
setvalue
="new"
where id =1;
commit
;--事務1再次執行select,得到結果value = "new"
select
*from
table
where id =
1
乙個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料,這種現象就稱為「幻讀」。例子如下:
--事務1先執行,查詢到了0條資料
select
*from
table
where id>3;
--事務2執行並且提交
insert
into
table
values(4
,"test");
commit
;--事務1再執行insert,發生了錯誤
insert
into t values(4
,"real"
);
在這種隔離級別下,select語句是不加鎖的,在這種隔離級別下以上三種問題都會出現。
但是它是併發最高的。
所有的select
語句都會被隱式的轉化為select ... in share mode
,這意味著:
如果有未提交的事務正在修改某些行,所有讀取這些行的select都會被阻塞住。
這種隔離級別下,所有的問題都不會出現,但是併發性最差。
在rr級別下的加鎖規則
自增鎖是專門針對事務插入auto_increment
型別的列,如果乙個事務正在往表中插入記錄,所有其他事務的插入必須等待,以便第乙個事務插入的行是連續的主鍵值。
意向鎖:未來的某個時刻,事務可能要加共享/排它鎖了,先提前宣告乙個意向,它是表級別的鎖,分為以下兩種:
-- 要設計is鎖
select..
.lock
inshare
mode
-- 要設計ix鎖
select..
.for
update
意向鎖之間並不相互互斥,而是可以並行。
插入意向鎖,是間隙鎖的一種(所以,也是實施在索引上的),它是專門針對insert操作的。
多個事務,在同乙個索引同乙個範圍區間插入記錄時,如果插入的位置不衝突,不會阻塞彼此
封鎖某一條的索引記錄
--它會在id為1的索引記錄上加鎖,以阻止其他事務插入,更新,刪除id=1這一行
select
*from
table
where id =
1for
update
封鎖索引記錄中的間隔,或者第一條索引記錄之前的範圍,又或者最後一條索引記錄之後的範圍。
進行等待,直到超時,通過引數innodb_lock_wait_timeout
控制超時時間
發起死鎖檢測,主動回滾死鎖鏈條中的某乙個事務,讓其他事務得以繼續進行。通過引數innodb_deadlock_detect
進行控制
理解MySql事務隔離機制 鎖以及各種鎖協議
一直以來對資料庫的事務隔離機制的理解總是停留在表面,其內容也是看一遍忘一邊。這兩天決定從原理上理解它,整理成自己的知識。查閱資料的過程中發現好多零碎的概念如果串起來足夠寫一本書,所以在這裡給自己梳理乙個脈絡,具體的內容參考引文或在網上搜一下。由於平時接觸最多的是mysql,所以文章中某些部分是mys...
事務隔離與鎖機制
innodb 儲存引擎既支援行級鎖,也支援表級鎖,預設情況下使用行級鎖。所謂表級鎖,它直接鎖住的是乙個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖衝突的概率更高,併發度最低。所謂行級鎖,它直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖衝突的概率較低,併發度很高。所謂頁級鎖,它是鎖住的乙個...
mysql 鎖 事務隔離級別
最近在看mysql相關的書籍.實驗了一些內容.分享一下,主要是關於事務隔離級別 read committed和repeatable read 和鎖相關的.很多網上文章上都能搜尋到 read committed可以防止髒資料.但是不能防止 不可重複讀.而repeatable read可以防止 不可重複...