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