一、事物回滾預設:執行時異常(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中的方法,而一般的事務宣告時不是宣告在 業務邏輯方法上的,...