資料庫事務機制

2021-08-28 03:28:50 字數 2067 閱讀 5114

什麼是事務:

事務(transaction)是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。

通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。

(當我們需要執行多個sql語句,我們需要用事務操作,保證sql要麼全部成功,要麼全部失敗)

事務是怎麼實現的?

借助::

undo log:(記錄之前的值)

在操作任何資料之前,首先將資料備份到乙個地方(這個儲存資料備份的地方成為undo log)。

redo_log:(記錄之後的值)

和undo log相反,redo log記錄的是新資料的備份。在事務提交前,只要將redo log持久化即可,

不需要將資料持久化。當系統崩潰時,雖然資料沒有持久化,但是redo log已經持久化。系統可以根據

redo log的內容,將所有資料恢復到最新的狀態。

事務執行步驟:

事務通常是以begin transaction開始,以commit或rollback結束。

commit表示提交,即提交事務的所有操作。具體地說就是將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中去,事務正常結束。

rollback表示回滾,即在事務執行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對資料庫的所有以完成的操作全部撤消,滾回到事務開始的狀態。

資料庫的四大屬性

事務併發排程的問題

髒讀(dirty read):a事務讀取b事務尚未提交的更改資料,並在這個資料基礎上操作。如果b事務回滾,那麼a事務讀到的資料根本不是合法的,稱為髒讀。在oracle中,由於有version控制,不會出現髒讀。

不可重複讀(unrepeatable read):a事務讀取了b事務已經提交的更改(或刪除)資料。比如a事務第一次讀取資料,然後b事務更改該資料並提交,a事務再次讀取資料,兩次讀取的資料不一樣。

幻讀(phantom read):a事務讀取了b事務已經提交的新增資料。注意和不可重複讀的區別,這裡是新增,不可重複讀是更改(或刪除)。這兩種情況對策是不一樣的,對於不可重複讀,只需要採取行級鎖防止該記錄資料被更改或刪除,然而對於幻讀必須加表級鎖,防止在這個表中新增一條資料。

第一類丟失更新:a事務撤銷時,把已提交的b事務的資料覆蓋掉。

第二類丟失更新:a事務提交時,把已提交的b事務的資料覆蓋掉。

**封鎖協議

一級封鎖協議:事務t中如果對資料r有寫操作,必須在這個事務中對r的第一次讀操作前對它加x鎖,直到事務結束才釋放。事務結束包括正常結束(commit)和非正常結束(rollback)。

二級封鎖協議:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,讀完後方可釋放s鎖。 

**封鎖協議 :一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,直到事務結束才釋放。

可見,**鎖操作乙個比乙個厲害(滿足高階鎖則一定滿足低階鎖)。但有個非常致命的地方,一級鎖協議就要在第一次讀加x鎖,直到事務結束。幾乎就要在整個事務加寫鎖了,效率非常低。**封鎖協議只是乙個理論上的東西,實際資料庫常用另一套方法來解決事務併發問題。

隔離性級別

mysql用意向鎖(另一種機制)來解決事務併發問題,為了區別封鎖協議,弄了乙個新概念隔離性級別:包括read uncommitted、read committed、repeatable read、serializable,見這篇。mysql 一般預設repeatable read。

終於發現自己為什麼會誤會事務能解決丟失修改了。至於為什麼隔離性級別不解決丟失修改,我猜是有更好的解決方案吧。

總結一下,repeatable read能解決髒讀和不可重複讀,但不嗯呢該解決丟失修改。

資料庫事務和鎖機制

前幾日有乙個獵頭公司的面試,其中問道我事務隔離這塊的知識點,猛一問真是想不起來啊,頓感羞愧啊,回來專門總結一下這方面的知識來夯實一下之前的知識體系,也提醒廣大園友們進步在於總結啊,好多不用的知識點,有時候有必要溫故知新啊。簡介 acid,是指在可靠資料庫管理系統 dbms 中,事務 transact...

redis資料庫的事務機制

redis雖然是nosql資料庫,但是作為被使用廣泛的快取性高速資料庫,當乙個鍵被多個請求同時訪問時,如何保證資料安全呢?其實redis也是有事務機制的,redis的事務機制類似於批處理功能,一旦開啟,不允許被打斷 事務機制的五個常用命令 1,watch 2,unwatch 3,multi 4,ex...

spring事務傳播機制與資料庫事務隔離級別

事務傳播行為型別 說明propagation required pr p ge n 傳輸 r kwa d 必須 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。propagation supports s p t 支援 支援當前事務,如果當前沒有事務,就以非事務方式執行。...