1. 程式人生 > 其它 >事務傳播機制和隔離級別

事務傳播機制和隔離級別

 先看下Spring的 事務傳播行為型別

 

事務傳播行為型別

說明

PROPAGATION_REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支援當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就丟擲異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則丟擲異常。

PROPAGATION_NESTED

如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與 PROPAGATION_REQUIRED 類似的操作。

 

事務隔離級別           資料庫併發操作存在的異常情況:
1. 更新丟失(Lost update): 兩個事務都同時更新一行資料但是第二個事務卻中途失敗退出導致對資料兩個修改都失效了這是系統沒有執行任何鎖操作因此併發事務並沒有被隔離開來。 2. 髒讀取(Dirty Reads): 一個事務開始讀取了某行資料但是另外一個事務已經更新了此資料但沒有能夠及時提交。這是相當危險很可能所有操作都被回滾。 3. 不可重複讀取(Non-repeatable Reads): 一個事務對同一行資料重複讀取兩次但是卻得到了不同結果。例如在兩次讀取中途有另外一個事務對該行資料進行了修改並提交。 4. 兩次更新問題(Second lost updates problem): 無法重複讀取特例,有兩個併發事務同時讀取同一行資料然後其中一個對它進行修改提交而另一個也進行了修改提交這就會造成第一次寫操作失效。 5. 幻讀(Phantom Reads): 也稱為幻像(幻影)。事務在操作過程中進行兩次查詢,第二次查詢結果包含了第一次查詢中未出現的資料(這裡並不要求兩次查詢SQL語句相同)這是因為在兩次查詢過程中有另外一個事務插入資料造成的。       為了避免上面出現幾種情況在標準SQL規範中定義了4個事務隔離級別,不同隔離級別對事務處理不同 。 1.未授權讀取(Read Uncommitted): 也稱未提交讀。允許 髒讀取但不允許更新丟失,如果一個事務已經開始寫資料則另外一個數據則不允許同時進行寫操作但允許其他事務讀此行資料。該隔離級別可以通過“排他寫鎖”實 現。事務隔離的最低級別,僅可保證不讀取物理損壞的資料。與READ COMMITTED 隔離級相反,它允許讀取已經被其它使用者修改但尚未提交確定的資料。 2. 授權讀取(Read Committed): 也稱提交讀。允許不可重 復讀取但不允許髒讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現,讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交寫事務將會禁止其他事務 訪問該行。SQL Server 預設的級別。在此隔離級下,SELECT 命令不會返回尚未提交(Committed) 的資料,也不能返回髒資料。 3. 可重複讀取(Repeatable Read): 禁止不可重複讀取和 髒讀取。但是有時可能出現幻影資料,這可以通過“共享讀鎖”和“排他寫鎖”實現,讀取資料事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事 務。在此隔離級下,用SELECT 命令讀取的資料在整個命令執行過程中不會被更改。此選項會影響系統的效能,非必要情況最好不用此隔離級。 4. 序列(Serializable): 也稱可序列讀。提供嚴格的事務隔 離,它要求事務序列化執行,事務只能一個接著一個地執行,但不能併發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的 資料不會被剛執行查詢操作事務訪問到。事務隔離的最高級別,事務之間完全隔離。如果事務在可序列讀隔離級別上執行,則可以保證任何併發重疊事務均是序列 的。
隔離級別     更新丟失 髒讀取 重複讀取 幻讀
未授權讀取     N            Y         Y          Y
授權讀取        N            N         Y          Y
可重複讀取     N            N         N         Y
序列               N            N         N         N