事物回滾與異常丟擲的坑

2021-09-11 17:18:55 字數 1024 閱讀 1541

一、事物回滾預設:執行時異常(runtimeexception)和程式錯誤(error)

下面這段**事務不會回滾:

@service

public class productserviceimpl implements productservice

}

以上**資料庫插入仍然成功,因為spring boot專案,只有runtimeexception和error時,事物才會回滾。而以上**跑出的是sqlexception,所以插入資料庫仍然成功。如果要一切異常都進行回滾,則在類上加下面這句即可:

@transactional(rollbackfor = exception.class)
二、try… catch…**塊將異常捕獲,使事務不回滾

下面**是很好的例子:

@service

public class cityserviceimpl implements cityservice catch (exception e)

}}

因為手動丟擲的異常被catch捕獲了,所以**沒有執行丟擲異常的那句,事務不會回滾。要回滾的方法就是不寫catch語句。

三、事務的優先順序大於鎖的優先順序

請看下面這段**:

@service

public class cityserviceimpl implements cityservice

}

批量操作時,會發現有重複的資料,一般情況下,已經存在的資料會進行更新,而不會二次插入。原因就在於舉個例子:

a和b兩條資料完全一樣,a進入了插入方法,插入成功後,釋放了鎖,此時事務還沒有結束,b進來呼叫了插入方法,因為事務沒有結束,事務優先順序大於鎖的優先順序,所以會插入兩條完全一樣的資料。

解決方法:一 、去掉事務;二、在外部呼叫這個cityserviceimpl 時加鎖

關於 sqlserver 的事物回滾

例 先進行標記事物的開始 begin transaction 進行表的操作,例如插入 修改等。在進行過程中,如果發生錯誤則回滾事物 rollback transaction 若事物結束,則提交事物 commit 在事物過程中通常用 error 語句是否發生錯誤 例如,插入幾條資料,後面的資料主鍵重複...

子執行緒異常丟擲 及 主線程事務回滾

業務模型期望的結果是這樣的,檢測子執行緒的異常情況,如果發生異常,主線程回滾,否則提交 2.如果執行緒丟擲unchecked runnable exception,則執行緒終結,主線程不受影響。所以使用runnable,主線程壓根不知道子執行緒的情況,事務更無從談起。所以使用callable機制 兩...

spring事物的提交與回滾

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 註解方式宣告事務,該事務宣告的範圍是service中的方法,而一般的事務宣告時不是宣告在 業務邏輯方法上的,...