事務(wù)

1. 物理存儲結(jié)構(gòu)

1.1 表空間

支持兩類表空間: 共享,獨立
5.5 版本 :  默認共享表空間.    包含: 數(shù)據(jù)字典\undo\tmp\用戶表數(shù)據(jù)和索引
5.6 版本 :  默認獨立表空間.    包含: 數(shù)據(jù)字典\undo\tmp,將用戶數(shù)據(jù)和索引獨立,每個表單獨存儲
5.7 版本 :  默認獨立表空間.    包含: 數(shù)據(jù)字典\undo,tmp獨立,將用戶數(shù)據(jù)和索引獨立,每個表單獨存儲
8.0 版本 :  默認獨立表空間.    數(shù)據(jù)字典取消掉, undo,tmp獨立  將用戶數(shù)據(jù)和索引獨立,每個表單獨存儲

1.2 功能名詞介紹

transaction           事務(wù)
undo  : ibdata1       回滾日志
tmp   : ibtmp1        臨時表空間 
redo  : ib_logfile0~N 重做日志
ibd   : t1.ibd        表空間數(shù)據(jù)文件


Innodb Buffer Pool    數(shù)據(jù)緩沖區(qū)池(70-80%)
log buffer            重做日志緩沖區(qū)
LSN                   日志序列號  
Trx_id                事務(wù)ID
checkpoint            檢查點  

1.3 事務(wù) ?

1.3.1 什么是事務(wù)?

將多條DML(標(biāo)準(zhǔn)的事務(wù)語句),放在一個"組"中運行,要么全成功要么全失敗.

1.3.2 事務(wù)ACID特性atomicity, consistency, isolation, and durability.

A   : 原子性   : 每一個事務(wù)都是一個完整整體,不可再分性 . 要么全執(zhí)行成功要么全失敗.
C   : 一致性   : 在事務(wù)前,中,后,保證事務(wù)操作的數(shù)據(jù)前后一致.
I   : 隔離性   : 多個事務(wù)之間,所做事務(wù)互不干擾,不能同時更新同一行數(shù)據(jù).
D   : 持久性   : 事務(wù)完成之后,所涉及到的數(shù)據(jù),必須永久有效(落地)

1.3.3 事務(wù)的生命周期管理

標(biāo)準(zhǔn)的事務(wù)生命周期: 
(1) 開啟一個事務(wù) 
begin / start transaction;
(2) 標(biāo)準(zhǔn)的事務(wù)語句 
insert 
update  
delete
(3) 結(jié)束事務(wù) 
commit;     # 提交事務(wù) 
rollback; # 回滾事務(wù)
 

非標(biāo)準(zhǔn)的事務(wù)生命周期
(1) 自動提交機制 
MySQL 5.6 以后:
1. begin子句會自動添加
2. 每一條執(zhí)行完成之后都會自動提交
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
[root@db01 data_3306]# vim /etc/my.cnf 
autocommit=0
[root@db01 data_3306]# /etc/init.d/mysqld restart
說明: 默認情況下,開啟事務(wù)時不加begin,逐條自動提交. 手工開啟begin命令,按照正常事務(wù)工作過程.


(2) 隱式提交
用于隱式提交的 SQL 語句:
begin 
a
b
begin
SET AUTOCOMMIT = 1
導(dǎo)致提交的非事務(wù)語句:
DDL語句: (ALTER宇姚、CREATE 和 DROP)
DCL語句: (GRANT浑劳、REVOKE 和 SET PASSWORD)
鎖定語句:(LOCK TABLES 和 UNLOCK TABLES)
導(dǎo)致隱式提交的語句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE


(3) 隱式回滾
會話斷開
數(shù)據(jù)庫重啟
死鎖 

1.3.4 事務(wù)底層的工作過程

image.png
(1) redo 
分布: 
    內(nèi)存: log buffer
    磁盤: ib_logfile0~N
功能: 
    1. 保存內(nèi)存數(shù)據(jù)頁的變化
    2. commit時, 實現(xiàn)事務(wù)的快速持久化的特性:  量少,順序IO
    3. 宕機時,通過redo實現(xiàn)重做事務(wù),將數(shù)據(jù)庫恢復(fù)到宕機之前的狀態(tài).
    我們由把這步稱之為 ACSR 中的"前滾"操作
(2) undo 回滾日志
分布:    默認 ibdata1, 5.7開始可以獨立undo,8.0后自動獨立 

功能 :   
     1. 保存當(dāng)前事務(wù)操作的反操作
     2. 在執(zhí)行rollback命令時,undo提供回滾操作,在ACID中主要實現(xiàn)A的特性,CI也有部分功能
     3. 宕機時,ACSR過程中提供回滾操作(將沒有commit標(biāo)記的)

1.3.5 鎖(寫) 及 隔離級別(讀)主要保證隔離性

(1) 鎖 :
 S    : 共享鎖,讀鎖
 X    : 排它鎖,寫鎖
 IS   : 意向S 
 IX   : 意向X

(2) X 鎖的細分

TX       ------> 表鎖   DDL
全局鎖表:
備份時,備份系統(tǒng)表時(非INOODB表),FTWRL
mysql> flush table with read lock;
mysql> unlock tables;
單表: DDL

mysql> lock table t1 read ;
mysql> unlock tables; 

RX       ------> 記錄鎖 DML
GAP  LOCK X     ------> 間隙鎖 特殊DML
Next LOCK X     ------> 下一鍵鎖定

(3) 隔離級別(transaction_isolation)
mysql> select @@transaction_isolation;
RU :讀未提交 READ-UNCOMMITTED

模擬:
session A
mysql> begin;
mysql> use world
mysql> delete from city where id=1000;

session B
mysql> begin;
mysql> use world
mysql> select *from city where id=1000;

會產(chǎn)生的問題:
1. 臟讀:A表刪除一段數(shù)據(jù)魔熏,B表進行查詢可以發(fā)現(xiàn)這條數(shù)據(jù)不存在鸽扁。當(dāng)A表進行回滾操作(rollback)后桶现,B表再次進行查詢,發(fā)現(xiàn)數(shù)據(jù)又會回來骡和。
效果如圖:


image.png

2. 不可重復(fù)讀現(xiàn)象
3. 幻讀

RC :讀已提交 ***** READ-COMMITTED
1. 不可重復(fù)讀現(xiàn)象:執(zhí)行同一條語句所得結(jié)果不同。
效果如圖:


image.png

2. 幻讀:A表執(zhí)行某種操作時唤衫,B表插入符合A表所執(zhí)行條件的數(shù)據(jù)绵脯,A表執(zhí)行完成commit后,經(jīng)過查詢植兰,結(jié)果與所執(zhí)行命令的條件不符璃吧,這種情況為幻讀。

RR :可重復(fù)讀 ***** REPEATABLE-READ
1. 幻讀
說明:

  1. RR級別+ GAP(間隙所)+ Next lock(GAP+RX(記錄鎖))有效防止幻讀現(xiàn)象
  2. 通過MVCC,多版本并發(fā)控制中,一致性快照讀技術(shù),解決了不可重復(fù)讀問題.
    SR :串行化

總結(jié):
AID 都是為了數(shù)據(jù)庫最終一致性 C
SQL_MODE
約束

自己擴展:
MDL 原數(shù)據(jù)鎖
page lock 頁鎖
latch 內(nèi)存頁鎖

2. InnoDB 存儲引擎核心參數(shù) *****

mysql> select @@innodb_data_file_path;     共享表空間的設(shè)置參數(shù)
mysql> select @@innodb_file_per_table;     共享表空間的設(shè)置參數(shù)
mysql> select @@innodb_buffer_pool_size;   #不要超過80%物理內(nèi)存 ----> Out of memory  
mysql> select @@innodb_log_buffer_size;    日志緩沖區(qū)的大小
mysql> select @@innodb_log_file_size;      日志文件的大小
mysql> select @@innodb_log_file_in_group;
mysql> select @@innodb_flush_log_at_trx_commit; # 雙1標(biāo)準(zhǔn)之一.控制redo刷寫的策略.
0  每秒鐘刷寫redo到磁盤. 
1  每次事務(wù)提交,理解刷寫redo到磁盤
2  每次事務(wù)提交,立即寫日志到OS cache中,然后每秒鐘刷寫到磁盤.

mysql> select @@innodb_flush_method; 控制(buffer臟頁,redo buffer日志)刷寫方式
建議設(shè)置:   
    O_DIRECT :  數(shù)據(jù)頁刷寫磁盤直接穿過文件系統(tǒng)緩存,redo 刷寫時,先寫os cache,再寫到磁盤筒繁。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毡咏,一起剝皮案震驚了整個濱河市逮刨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恢总,老刑警劉巖睬愤,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砂豌,居然都是意外死亡光督,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門娄涩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事努隙≥┠鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵张惹,是天一觀的道長岭洲。 經(jīng)常有香客問我,道長盾剩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任屎暇,我火速辦了婚禮根悼,結(jié)果婚禮上蜀撑,老公的妹妹穿的比我還像新娘。我一直安慰自己屯掖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绍坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椎咧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天蟋座,我揣著相機與錄音脚牍,去河邊找鬼。 笑死诸狭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芹彬。 我是一名探鬼主播叉庐,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眨唬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匾竿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤临庇,失蹤者是張志新(化名)和其女友劉穎昵慌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋攀,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年侧蘸,在試婚紗的時候發(fā)現(xiàn)自己被綠了讳癌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片存皂。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骤菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情商乎,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站崩瓤,受9級特大地震影響踩官,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔗牡,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一颖系、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辩越,春花似錦嘁扼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至督惰,卻和暖如春不傅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赏胚。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工访娶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崖疤。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像留拾,于是被迫代替她去往敵國和親戳晌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理痴柔,叫他看這篇文章(轉(zhuǎn))" date...
    藍墜星閱讀 793評論 0 3
  • 索引 數(shù)據(jù)庫中的查詢操作非常普遍,索引就是提升查找速度的一種手段 索引的類型 從數(shù)據(jù)結(jié)構(gòu)角度分 1.B+索引:傳統(tǒng)...
    一凡呀閱讀 2,920評論 0 8
  • 事務(wù)處理 事務(wù)處理是數(shù)據(jù)庫中的一個大塊頭豪嚎,涉及到數(shù)據(jù)的完整性與一致性問題搔驼,由于mysql存在多種數(shù)據(jù)存儲引擎提供給...
    tanghomvee閱讀 742評論 0 0
  • 作者:55 來自微信公眾號:老友信 寒假前兩周,一 一變得什么都不想干侈询,早上穿衣服都讓奶奶代勞舌涨。我突然想起在哪里看...
    33語安閱讀 607評論 0 50
  • 楔子 興致上來和方知晴通了個電話,我耳里是操場上凌冽的風(fēng)扔字,她身邊是寢室干燥的暖氣囊嘉。 進了大學(xué),有的人很久才聯(lián)系一次...
    塵榭閱讀 190評論 0 0