【MySQL】深入浅出剖析mysql事务锁机制 - 笔记
事務的基本概念
事務的特點(ACID)
快照:之前的某一個歷史的狀態(類比虛擬機的快照),用于實現原子性
隔離性:通過鎖機制來實現
鎖:共享鎖,排它鎖,獨占鎖,臨鍵鎖,間隙鎖,自增鎖,意向鎖
持久性:使用來實現
WAL日志:write ahead log,預寫日志
Hbase主要操作內存,因為速度快。也是用WAL來保證數據不丟失。
數據在內存中,然后通過fsync寫進磁盤。
一致性:是數據庫的根本追求。
事務的特點
MySQL主要有3種日志:redolog,undolog,binlog(其他還有relaylog,slowlog慢查詢日志)
binlog是歸屬server的,無論什么存儲引擎,都有這個log
redolog,undolog是歸屬innodb的,如果換成myisam,就不存在這兩種log
原子性實現原理:Undo log
邏輯日志:數據是統一放在磁盤里的,要想讀取,需要拉取到內存(一次讀取的最小邏輯單元的單位是頁),頁的大小和操作系統相關,innodb默認一次讀取16kb的數據。邏輯日志是對當前的sql語句做一次記錄。
物理日志:物理日志表示修改當前頁的數據。
MVCC:multipart version concurrency control 多版本并發控制
B修改時,A可以通過undolog讀取歷史數據
持久性實現原理:Redo log
數據的存儲 :當前進程內存->操作系統內存->磁盤
電腦啟動完成之后,所有的硬件設備交由內核來控制,用戶空間要與內核交互,才能訪問設備的資源。
kafka通過零拷貝、順序讀寫,減少了內存復制,直接寫進磁盤中
以下:考慮到不同的時候可能斷電,這三種方式的安全性 1>2>0,默認是使用1
做n次數據的修改,并不是每一次都直接寫進磁盤中。會先寫進內存,內存占用達到一定閾值之后才寫進磁盤中。
如何理解redolog?
redolog文件是循環存儲的
Mysql隔離級別
默認隔離級別:
MySQL:可重復讀
Oracle:讀已提交
臟讀:讀沒提交的數據
RC (READ COMMITTED)讀更新之后的快照數據,永遠是最新的快照
RR (REPEATABLE READ)讀當前事務開啟之前的快照數據
在一個表中,有2個用戶不可見的列:createtime,deletetime(存的是當前事務的id值,而不是時間戳)
讀數據的時候,讀取的是createtime小于等于當前事務id,并且deletetime為空或deletetime大于等于當前事務id的數據
間隙鎖是否能解決幻讀問題?
間隙鎖:給某一個范圍加鎖。
select * from table1 for update
鎖的是索引
select * 是全表掃描,沒有使用索引
表級鎖和行級鎖辨析:
如下圖,innodb可以主動探知到死鎖
如果設置了自增id,即使插入失敗,id也會增加。
同樣,使用duplicate update語句時,即使走的是update,也會讓id增加。
總結
以上是生活随笔為你收集整理的【MySQL】深入浅出剖析mysql事务锁机制 - 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【jQuery】使用jquery.for
- 下一篇: linux cmake编译源码,linu