1 3 事物和併發一致性問題

2022-08-01 05:24:11 字數 2179 閱讀 3970

1.3.1

事務

事物指的是滿足 acid 特性的一組操作,可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。事務處理可以用來維護資料庫的完整性,保證成批的 sql 語句要麼全部執行,要麼全部不執行。

一般來說,事務是必須滿足4個條件(acid)::原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、永續性(durability)。

事務的 acid 特性概念簡單,但不是很好理解,主要是因為這幾個特性不是一種平級關係:

可以使用start transaction語句開始乙個事物,然後要麼使用commit提交事務將修改的資料持久保留,要麼使用rollback撤銷所有修改。

mysql 預設採用自動提交(autocommit)模式。也就是說,如果不顯式使用start transaction語句來開始乙個事務,那麼每個查詢都會被當做乙個事務自動提交。在當前連線中,可以通過設定autocommit變數來啟用或者禁用自動提交模式。1或者on表示開啟,0或者off表示禁用。當autocommit=0時,所有的查詢都是在乙個事物中,直到顯示的執行commit提交或者rollback回滾,該事物結束,同時又開始了另乙個新事物。

1.3.2 併發一致性問題

在併發環境下,事務的隔離性很難保證,因此會出現很多併發一致性問題。

t1 和 t2 兩個事務都對乙個資料進行修改,t1 先修改,t2 隨後修改,t2 的修改覆蓋了 t1 的修改。

t1 修改乙個資料,t2 隨後讀取這個資料。如果 t1 撤銷了這次修改,那麼 t2 讀取的資料是髒資料。

t2 讀取乙個資料,t1 對該資料做了修改。如果 t2 再次讀取這個資料,此時讀取的結果和第一次讀取的結果不同。

t1 讀取某個範圍的資料,t2 在這個範圍內插入新的資料,t1 再次讀取這個範圍的資料,此時讀取的結果和和第一次讀取的結果不同。

小結:不可重複讀的和幻影讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

產生併發不一致性問題主要原因是破壞了事務的隔離性,解決方法是通過併發控制來保證隔離性。併發控制可以通過封鎖來實現,但是封鎖操作需要使用者自己控制,相當複雜。資料庫管理系統提供了事務的隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題。

1.3.3 隔離級別

事務中的修改,即使沒有提交,對其它事務也是可見的。事物可以讀取未提交的資料,即髒讀。

乙個事務只能讀取已經提交的事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。這個級別也叫不可重複讀,因為兩次執行同樣的查詢,可能會得到不一樣的結果。

解決了髒讀的問題。保證在同乙個事務中多次讀取同樣資料的結果是一樣的。但是還是無法解決幻影讀的問題。

可重複讀是mysql的預設事物隔離級別。

是最該的隔離級別。強制事務序列執行。避免了幻影讀的問題。會在讀取的每一行資料上都加鎖,所以可能導致大量的超時和鎖爭用的問題,實際應用中也很少用,只有在非常需要確保資料一致性而且可以接受沒有併發的情況下,才考慮採用該級別。

隔離級別

髒讀不可重複讀

幻影讀加鎖讀

未提交讀√√

√×提交讀×√√

×可重複讀××

√×可序列化××

×√1.3.4 死鎖

死鎖是指兩個或者多個事物在同一資源上相互占用,並請求鎖定對方的資源,從而導致惡性迴圈的現象。當多個事物試圖以不同的順序鎖定資源時,就可能會產生死鎖。多個事物同時鎖定同乙個資源時,也會產生死鎖。

併發一致性問題

常見併發併發一致性問題包括 丟失的修改 不可重複讀 讀髒資料 幻影讀 幻影讀在一些資料中往往與不可重複讀歸為一類 2.2.1.1 丟失修改 下面我們先來看乙個例子,說明併發操作帶來的資料的不一致性問題。考慮飛機訂票系統中的乙個活動序列 甲售票點 甲事務 讀出某航班的機票餘額a,設a 16.乙售票點 ...

Session一致性問題

1 什麼是session session在網路應用上表示 會話控制 用於儲存特定使用者會話所需的屬性及配置資訊 session又表示乙個特定的時間間隔,指從登入進入系統到登出退出系統之間所經過的時間。http是無狀態的協議,在動態web應用中,往往需要知道前面的操作和後面的操作是不是乙個使用者。也就...

資料庫 併發一致性問題

在併發環境下,事務間的隔離性很難保證,因此會出現併發一致性問題。併發一致性問題主要有四類,即 丟失修改問題,讀髒資料問題,不可重複讀問題,幻影讀問題。丟失修改問題 t1和t2兩個事務都對同一資料進行修改,t1先修改,t2隨後修改,t2的修改覆蓋了t1的修改。讀髒資料問題 t1修改了乙個資料,t2隨後...