MySQL事务及锁机制大揭秘 - 公开课笔记
Spring事務(wù)和數(shù)據(jù)庫(kù)事務(wù)有什么區(qū)別?
Spring提供了一個(gè)類,由這個(gè)類以AOP的方式管理,只需要@Transactional即可
為什么要有事務(wù)?
事務(wù)的基本概念:要不然全成功,要不然全失敗,為了保證一致性。
轉(zhuǎn)賬的步驟需要3條語(yǔ)句:查詢A賬戶,A賬戶減去,增加B賬戶
跨行轉(zhuǎn)賬:分布式事務(wù)
一些處理機(jī)制:2階段提交、3階段提交…
ACID
原子性 一致性 隔離性 持久性
每個(gè)特點(diǎn)底層實(shí)現(xiàn)的原理是什么?
原子性
事務(wù)中的所有操作作為一個(gè)整體,像原子一樣不可分割,通過(guò)undolog 回滾日志實(shí)現(xiàn)
undolog 存在哪里?
log有幾種?
binlog, undolog, redolog, relaylog, errorlog, slowlog
MySQL可以看做是分為3層
(查詢緩存在8.0之后就沒(méi)有了)
只有innodb存儲(chǔ)引擎有 redolog,undolog
所有存儲(chǔ)引擎都有binlog,errorlog,relaylog,slowlog
既然有binlog,為什么還需要redolog,undolog?
因?yàn)樵趍ysql剛開(kāi)始誕生的時(shí)候,并沒(méi)有innodb引擎,用的是myisam引擎,它不支持事務(wù)。
innodb引擎后來(lái)被創(chuàng)造之后,一開(kāi)始是以插件的形式運(yùn)行的,但是在5.5版本之后,默認(rèn)使用的是innodb存儲(chǔ)引擎。
如何在操作數(shù)據(jù)之前,將數(shù)據(jù)備份到一個(gè)地方?
undolog,使用反邏輯,根據(jù)邏輯計(jì)算出實(shí)際的值,而不需要在每一個(gè)狀態(tài)的時(shí)候都存儲(chǔ)一份數(shù)據(jù)。
相當(dāng)于:(實(shí)際上不是這樣存儲(chǔ)的)
undolog是否需要落盤?
隔離
并發(fā)操作,兩個(gè)人同時(shí)操作同一個(gè)數(shù)據(jù),加鎖
加什么鎖?間隙鎖?樂(lè)觀鎖?共享鎖?排它鎖?
持久性
數(shù)據(jù)一旦發(fā)生了更新,一定要溢寫到磁盤。下次讀數(shù)據(jù)的時(shí)候,一定要和上一次是一樣的。
持久性通過(guò)redolog和binlog共同保證
持久性實(shí)現(xiàn)原理:redolog
innodb_flush_log_at_trx_commit參數(shù):
0:如果在0.9秒,MySQL服務(wù)崩了,會(huì)丟失1秒的數(shù)據(jù)。服務(wù)器斷電,該丟都丟。如果只是MySQL進(jìn)程掛了,依然會(huì)給你寫到磁盤中去。
1:如果在0.9秒,MySQL服務(wù)崩了,不會(huì)丟數(shù)據(jù)。每次提交都直接寫磁盤,做到數(shù)據(jù)足夠安全,但是會(huì)帶來(lái)性能問(wèn)題。
2:
為什么要有redolog?直接寫數(shù)據(jù)不行嗎?
WAL——Write Ahead Log溢日志
以下三種方法都不能做到嚴(yán)格不丟數(shù)據(jù),都有可能丟失1秒鐘數(shù)據(jù)。
批量操作的時(shí)候,不是每一次都提交事務(wù),而是分批提交。
如果插了900條,剩下100條突然斷電了,重啟之后,可以使用redolog繼續(xù)寫
redolog相當(dāng)于一個(gè)增量存儲(chǔ),redolog滿了之后,會(huì)進(jìn)行持久化的同步歸檔。然后將redolog清空。
undo和redo的執(zhí)行順序?
隔離級(jí)別
讀未提交,讀已提交,可重復(fù)度,序列化
不同的隔離級(jí)別可能導(dǎo)致不同的并發(fā)異常,如下圖:
不可重復(fù)讀:同一個(gè)事務(wù)可能讀到不同的數(shù)據(jù)
MVCC:multi version concurrency control 多版本并發(fā)控制
臟讀是指一個(gè)事務(wù)讀取到其他事務(wù)已修改未提交的內(nèi)容,不可重復(fù)讀是值 讀到其他事務(wù)已經(jīng)提交的內(nèi)容
不可重復(fù)讀
幻讀 跟 不可重讀讀,操作一樣,只不過(guò)一個(gè)是修改,一個(gè)是插入
read view
用undolog實(shí)現(xiàn)MVCC:
所以u(píng)ndolog還是要存磁盤,所以到底要不要存?
MySQL有多少種鎖?
自增鎖:id=10,插入10條失敗,下一次從21開(kāi)始
總結(jié)
以上是生活随笔為你收集整理的MySQL事务及锁机制大揭秘 - 公开课笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis实战(一):Redis一键安装
- 下一篇: MySQL调优(一):使用profile