mysql 事物状态有几种_mysql第三章 事务以及日志
mysql第三章 事務(wù)以及日志
一. 事物簡(jiǎn)介
每條DDL DCL語(yǔ)句都是事務(wù). 每個(gè)begin 到coomit語(yǔ)句是一個(gè)事務(wù)
二. 事物特性ACID以及開(kāi)啟方式
1. 原子性(A),部成功執(zhí)行或全部取消
2. 一致性(C),事物的開(kāi)始到結(jié)束期間狀態(tài)保持一致
3. 隔離性(I),事物之互不干擾
4. 持久性(D) 事物提交后數(shù)據(jù)準(zhǔn)確地記錄在數(shù)據(jù)庫(kù)中(redo),redobuff寫(xiě)入到redolog中事務(wù)才算comit成功
5. 事物的開(kāi)啟關(guān)閉
6. 開(kāi)啟事務(wù)begin ;
7. 進(jìn)行事物 DDL
8. 提交事物 commit; 隱形提交:DDL DCL 鎖定語(yǔ)句
9. 回滾事物(未提交才行) rollback;
三. redo log undo log 作用
1. redo log: 1.記錄了內(nèi)存數(shù)據(jù)頁(yè)的變化 2.提供WAL 3.提供ACSR過(guò)程中實(shí)現(xiàn)前滾的動(dòng)作
2. undo: 1.記錄數(shù)據(jù)修改之前的狀態(tài) 2.提供ACSR和事務(wù)工作中的回滾動(dòng)作 3. 提供 undo 快照 (MVCC)
3. ACSR(自動(dòng)故障恢復(fù)):Mysql斷電重啟時(shí)會(huì)檢查redo日志文件和數(shù)據(jù)文件LSN必須一致,如果不一致,已經(jīng)提交的數(shù)據(jù)前滾(redo log)+CKPT,未提交數(shù)據(jù)回滾(undo log).
5. 總結(jié): redo log和 undo log保證了事務(wù)ACID特性的ADC特性
6. 鎖(I):保證了事務(wù)ACID中的I特性和C特性
四. 隔離級(jí)別 *****
1. RU 讀未提交(臟讀),,
2. RC 讀已提交,會(huì)現(xiàn)幻讀,會(huì)出現(xiàn)不可重復(fù)讀(在大部分互聯(lián)網(wǎng)企業(yè)中是可以容忍的.金融公司除外) *****
3. RR 通過(guò)MVCC實(shí)現(xiàn)了可重復(fù)讀,但是有可能會(huì)出現(xiàn)幻讀現(xiàn)象,需配合,GAP和Next-lock進(jìn)行避免幻讀現(xiàn)象, 必須索引支持 ***** (默認(rèn))
5. SR 串行化,性能低
注: mysql配置文件
transaction_isolation=read-uncommitted transaction_isolation=read-committed transaction_isolation=REPEATABLE-READ五.名詞解釋
redo buffer :redo log內(nèi)存緩沖區(qū)域
buffer pool : ibd 的內(nèi)存緩沖區(qū)域
LSN : 動(dòng)作序列號(hào)(ibd ,redolog ,data buffer pool, redo buffer)
TXID:事務(wù)號(hào),每一個(gè)事務(wù)生成一個(gè)事務(wù)號(hào)
前滾:構(gòu)建臟頁(yè)(重新經(jīng)數(shù)據(jù)調(diào)動(dòng)到日志)
回滾:撤銷(xiāo)為提交的數(shù)據(jù)
ckpt:ibd數(shù)據(jù)刷寫(xiě)到磁盤(pán)
written :redo 寫(xiě)入等到OSBUFF(系統(tǒng)的buff)
WAL :持久性: redo buff 優(yōu)先于buff pool 寫(xiě)入到磁盤(pán)
幻讀:按照范圍update數(shù)據(jù)時(shí),位commmit期間,數(shù)據(jù)范圍沒(méi)有被鎖.使用RR模式解決
不可重復(fù)讀:查詢(xún)數(shù)據(jù)期間,數(shù)據(jù)非靜態(tài).
偽熱備:備份期間的變跟的數(shù)據(jù)不備份
relaylog: 主從復(fù)制中binlog轉(zhuǎn)存成relaylog
master.info : 記錄change master 信息
relaylog.info : 記錄relaylog的跟新號(hào)碼
六. ACSR 流程
假設(shè)我們做了一個(gè)事務(wù),begin;update;commit.
1. 在begin ,會(huì)立即分配一個(gè)TXID=tx_01.
2. update時(shí),會(huì)將需要修改的數(shù)據(jù)頁(yè)(dp_01,LSN=101),加載到data buffer中
3. DBWR線(xiàn)程,會(huì)進(jìn)行dp_01數(shù)據(jù)頁(yè)修改更新,并更新LSN=102
4. LOGBWR日志寫(xiě)線(xiàn)程,會(huì)將dp_01數(shù)據(jù)頁(yè)的變化+LSN+TXID存儲(chǔ)到redobuffer
5. 執(zhí)行commit時(shí),LGWR日志寫(xiě)線(xiàn)程會(huì)將redobuffer信息寫(xiě)入redolog日志文件中,基于WAL原則,
在日志完全寫(xiě)入磁盤(pán)后,commit命令才執(zhí)行成功,(會(huì)將此日志打上commit標(biāo)記)
6. 假如此時(shí)宕機(jī),內(nèi)存臟頁(yè)沒(méi)有來(lái)得及寫(xiě)入磁盤(pán),內(nèi)存數(shù)據(jù)全部丟失
7. MySQL再次重啟時(shí),必須要redolog和磁盤(pán)數(shù)據(jù)頁(yè)的LSN是一致的.但是,此時(shí)dp_01,TXID=tx_01磁盤(pán)是LSN=101,dp_01,TXID=tx_01,redolog中LSN=102
MySQL此時(shí)無(wú)法正常啟動(dòng),MySQL觸發(fā)CSR.在內(nèi)存追平LSN號(hào),觸發(fā)ckpt,將內(nèi)存數(shù)據(jù)頁(yè)更新到磁盤(pán),從而保證磁盤(pán)數(shù)據(jù)頁(yè)和redolog LSN一值.這時(shí)MySQL正長(zhǎng)啟動(dòng)
以上的工作過(guò)程,我們把它稱(chēng)之為基于REDO的"前滾操作"
六. 二進(jìn)制日志(binlog)作用******
1. 主從和備份恢復(fù)依賴(lài)二進(jìn)制
2. 只記錄已提交成功的事務(wù)的信息(DCL DDL DML)
3. DCL DDL:以語(yǔ)句的方式,原模原樣的記錄, DML則有有三種模式記錄(SBR RBR MBR)
SBR:做什么命令記錄什么,優(yōu)點(diǎn)日質(zhì)量少,缺點(diǎn):記錄不準(zhǔn)確,如插入now();
RBR記錄數(shù)據(jù)行的變化信息,優(yōu)點(diǎn):記錄準(zhǔn)確,缺點(diǎn):日質(zhì)量大(默認(rèn),推薦)
MBR混合模式:不用
4. GTID模式: 以事務(wù)為單位記錄日志 .每一個(gè)事物生成一個(gè)GTID ,GTID= severi_uuid:TID事務(wù)號(hào) pos動(dòng)作號(hào)
5. 日志滾動(dòng)規(guī)則:
5.1 刷新日志
5.2 重啟數(shù)據(jù)庫(kù)
5.3 二進(jìn)制日志默認(rèn)最大為1G(調(diào)小號(hào)碼容易用完)
七. 事務(wù)與線(xiàn)程
1. 會(huì)話(huà)可以創(chuàng)建多個(gè)事務(wù),一個(gè)事務(wù)只能由一個(gè)會(huì)話(huà)產(chǎn)生
2. 一個(gè)事務(wù)可能會(huì)產(chǎn)生一個(gè)或多個(gè)線(xiàn)程,一個(gè)線(xiàn)程在同一時(shí)間內(nèi)只能執(zhí)行一個(gè)事務(wù)
3. 一個(gè)線(xiàn)程就是一個(gè)連接(會(huì)話(huà))
4. 線(xiàn)程是串行事務(wù)
總結(jié)
以上是生活随笔為你收集整理的mysql 事物状态有几种_mysql第三章 事务以及日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu1804系统设置在哪里_斐讯
- 下一篇: 为什么有些xpath绝对路径拿不到数据_