資料庫事務實現原理

2021-10-03 15:05:23 字數 3049 閱讀 1179

資料庫事務是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。這些操作要麼全部執行,要麼全部不執行,是乙個不可分割的工作單位。

典型特性有原子性(atomicity),一致性(consistency),隔離性(isolation),永續性(durabilily),簡稱acid

原子性:事務作為乙個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。

一致性:指在事務開始之前和事務結束以後,資料不會被破壞,假如 a 賬戶給 b 賬戶轉 10 塊錢,不管成功與否,a 和 b 的總金額是不變的。

隔離性:多個事務併發訪問時,事務之間是相互隔離的,即乙個事務不影響其它事務執行效果。簡言之,就是事務之間是井水不犯河水的。

永續性:表示事務完成以後,該事務對資料庫所做的更改操作將持久地被儲存在資料庫中。

innodb 事務日誌包括redo log(重做日誌)和undo log(回滾日誌)。

redo log(重做日誌)

通常是物理日誌,記錄的是資料頁的物理修改,而不是某一行或某幾行的修改,用來實現事務的永續性

該日誌檔案主要由兩部分組成:重做日誌緩衝(redo log buffer)和重做日誌檔案(redo log),前者儲存在記憶體中,後者儲存在磁碟中。

mysql 為了提公升效能,不會把每次的修改都實時同步到磁碟,而是會先存到buffer pool(緩衝池) 裡頭,把這個當作快取來用。然後使用後台執行緒去做緩衝池和磁碟之間的同步。

那麼問題來了,如果還沒來的同步的時候宕機或斷電了怎麼辦?還沒來得及執行上面圖中紅色的操作,這樣會丟失部分已提交事務的修改資訊。

所以引入了redo log來記錄已成功提交事務的修改資訊,並且會把redo log持久化到磁碟,系統重啟之後再讀取redo log來恢復最新的資料。

undo log(回滾日誌)

redo log(重做日誌)記錄的是資料被修改後的資訊,而undo log(回滾日誌)跟redo log(重做日誌)所記錄的相反,是用於記錄資料被修改前的資訊

undo log主要記錄的是資料的邏輯變化,為了在發生錯誤時回滾之前的操作,需要將之前的操作都記錄下來,然後在發生錯誤時才可以回滾。

每次寫入資料或者修改資料之前都會把修改前的資訊記錄到 undo log,undo log 記錄事務修改之前版本的資料資訊。

可以這樣認為,當 delete 一條記錄時,undo log 中會記錄一條對應的 insert 記錄,當 update 一條記錄時,它記錄一條對應相反的 update 記錄。

因此假如由於系統錯誤或者rollback操作而回滾的話,可以根據undo log的資訊來進行回滾到沒被修改前的狀態,所以undo log用於保障未提交事務的原子性

mysql鎖技術

當有多個請求來讀取表中的資料時,可以不採取任何操作,但是多個請求裡有讀請求,又有修改請求時,就必須有一種措施來進行併發控制,不然很有可能會造成資料的不一致。

解決上述問題很簡單,只需用兩種鎖的組合:「讀寫鎖」,來對讀寫請求進行控制,讀寫鎖包含共享鎖(shared lock) 和排他鎖(exclusive lock) 。

共享鎖(shared lock),又叫做 「讀鎖」 ,是可以共享的,或者說多個讀請求可以共享一把鎖讀資料,不會造成阻塞。

排他鎖(exclusive lock),又叫做 「寫鎖」,會排斥其他所有獲取鎖的請求,一直阻塞,直到寫入完成釋放鎖。

通過讀寫鎖,可以做到讀讀可以並行,但是不能做到寫讀,寫寫並行,事務的隔離性就是根據讀寫鎖來實現的。

mvcc基礎

mvcc (multiversion concurrency control)叫做多版本併發控制

innodb的 mvcc ,是通過在每行記錄的後面儲存兩個隱藏的列來實現的。這兩個列, 乙個儲存了行的建立時間,乙個儲存了行的過期時間, 當然儲存的並不是實際的時間值,而是系統版本號

mvcc的主要實現思想是通過資料多版本來做到讀寫分離,從而實現不加鎖讀,進而做到讀寫並行。

mvcc在mysql中的實現依賴的是undo logread viewundo log記錄某行資料的多個版本的資料;而read view用來判斷當前版本資料的可見性。

重做日誌回滾日誌以及鎖技術就是實現事務的基礎。

總之,acid只是個概念,原子性,永續性,隔離性都是為了實現資料的一致性,事務的最終目的就是要保障資料的一致性。

Atitit 資料庫事務實現原理

atitit資料庫事務 實現原理 如果只是需要事務的話,你自己給mongo操作加上事務功能就可以啦。資料庫事務只不過是他自己實現了而已。如果資料庫不支援事務,就要你在 裡面實現事務就可以了。最簡單方便的就是使用日誌方式來做事務就可以了。比如插入倆個資料。每執行乙個 sql,就生成乙個 undo 日誌...

spring事務實現原理

如果你用過spring aop,那麼理解註解事務就十分簡單了。事務註解本質上實在事務方法加入乙個around切面,在方法開始前開始事務,在丟擲異常後回滾事務。使用簡單偽 可以簡單理解為 dowithtransaction catch exception ex spring transaction有各...

MySQL事務實現原理

以上是sql 92標準中定義的四種隔離級別。在mysql中,預設的隔離級別是repeatable read 可重複讀 並且解決了幻讀問題。不可重複讀重點在於update和delete,而幻讀的重點在於insert insert update delete 快照讀和當前讀 鎖定讀一致性非鎖定讀假如乙個...