1. 程式人生 > >spring事務和資料庫異常類別

spring事務和資料庫異常類別

spring事務傳播
PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支援當前事務,如果當前沒有事務,就丟擲異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

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

資料庫併發操作存在的異常情況:
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