您好,登錄后才能下訂單哦!
1.2.3. 使用WITH CONSISTENT SNAPSHOT子句的作用
START TRANSACTION語句使用WITH CONSISTENT SNAPSHOT子句時,會為事務啟動一致性讀(該子句僅適用于InnoDB)。其行為與執行START TRANSACTION語句之后+一個SELECT語句效果相同(會獲取一個事務號,在read view中占個坑,但是不會請求任何鎖)。WITH CONSISTENT SNAPSHOT子句不會自動修改當前的事務隔離級別,由于WITH CONSISTENT SNAPSHOT子句要求必須RR隔離級別下才會自動啟用,因此只有當前隔離級別為RR時才會啟用一致性快照,非RR隔離級別下,會忽略WITH CONSISTENT SNAPSHOT子句。從MySQL 5.7.2起,當WITH CONSISTENT SNAPSHOT子句被忽略時,會產生一個警告(類似上一篇mysqldump與innobackupex備份過程你知多少(一)提到的警告信息)。
為了使得更清晰地了解mysqldump在備份過程中使用WITH CONSISTENT SNAPSHOT子句的作用,下面咱們來演示一下帶與不帶WITH CONSISTENT SNAPSHOT子句會發生什么?
開啟兩個會話,操作同一張表
從上面的表格對比結果中可以看到:
WITH CONSISTENT SNAPSHOT子句的作用就相當于START TRANSACTION+ SELECT語句,目地是為了在開啟事務的那一刻往mvcc的read view中立即加入這個事務,就好像read view在事務一開始就被固定了一樣,使得后續其他事務的DML不會影響到該事務的查詢結果,這就是所說的一致性讀
如果不使用WITH CONSISTENT SNAPSHOT子句,在使用START TRANSACTION語句顯式開啟一個事務之后,在執行SELECT語句之前,這段時間內如果有別的事務發起了DML操作,就會導致該事務查詢該表的時候讀取的數據與事務開始時間點不一致。
1.2.4. 使用savepoint來設置回滾點的作用
大家都知道,設置SAVEPOINT是為了回滾在設置這個點時候發生變更的數據,但是mysqldump備份只是使用select語句做查詢,為什么要使用savepoint呢?需要回滾什么呢?請看下文分析:
SAVEPOINT 'identifier' 語句,為事務設置一個命名的事務保存點(回滾點),該字符串為事務保存點的標識符。
ROLLBACK TO SAVEPOINT 語句的作用是將事務回滾到指定的保存點的位置,而不終止事務。當前事務在回滾點之后的修改的行數據將被撤銷(注:InnoDB不會釋放這些發生修改且被撤銷行的行鎖,注意是修改,不是新插入,這些發生修改的數據行行鎖被存儲在內存中),對于設置了保存點之后,新插入的行數據也會被撤銷(注:這些鎖信息被存儲在行數據中的事務ID上,這些行鎖不會單獨存儲在內存中,在這種情況下,這些新插入的行數據在被回滾之后,對應的行鎖將被釋放)。另外,回滾到某個保存點之后,比這個保存點在時間上更晚設置的保存點將被刪除。
ROLLBACK TO SAVEPOINT 語句還有一個作用,可以釋放在設置保存點之后事務持有的MDL鎖,這點便是mysqldump需要使用保存點的關鍵點。
為了更清晰地了解mysqldump在備份過程中使用SAVEPOINT sp + ROLLBACK TO SAVEPOINT sp語句的作用,下面使用兩個會話演示一下使用與不使用保存點會發生什么?
從上面的對比結果中可以得知:
mysqldump使用savepoint的作用就是,當一個顯式開啟的事務回滾到保存點時,除了回滾數據變更之外,還會釋放保存點之后select語句獲取的MDL鎖,使得其他會話的DDL語句可以正常執行。對于mysqldump來說,select 語句執行完成之后就代表著該表的數據已經備份完成,無需再繼續持有MDL鎖,使用savepoint就實現了在select 執行完成之后釋放MDL鎖的目的(注:在事務內,執行select *語句雖然不會有數據行鎖,但是會持有表的MDL鎖)。
with consistent snapshot子句對應mysqldump實現一致性備份來說至關重要,不僅僅是數據的一致性,使用該子句時,表定義也保持事務開啟的那一刻,所以,從上面的對比結果中可以看到,使用了with consistent snapshot子句開啟一個一致性快照事務之后,如果一旦表結構定義發生改變,事務將無法重復查詢表。
從上面的演示過程中,我們也可以看到,使用 with consistent snapshot子句顯式開啟一個事務之后,如果該事務沒有對任何表做任何操作時,此時是沒有獲得任何鎖的,所以,如果在該事務對某表執行操作之前其他事務對該表執行了DDL操作之后,將導致該事務無法再對表執行查詢,會報表結構發生變化的錯誤;當然,如果顯式開啟事務后立即對某表執行查詢,那么其他會話的DDL是會發生阻塞的;當在該事務使用savepoint實現方式釋放表的MDL鎖之后,其他會話允許執行DDL,但是執行了DDL語句之后,該事務就無法再對該表執行查詢。當然,如果不使用 with consistent snapshot子句,則其他會話執行的DDL對表定義的變更不會影響到該事務重復對表執行查詢。
下一篇"mysqldump與innobackupex備份過程你知多少(三)"我們將接著介紹"關于mysqldump的那些坑”,精彩內容不容錯過,敬請期待!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。