解決辦法:把註解放到類上就可以了
原因:spring採用動態**(aop)實現對bean的管理和切片,它為我們的每個class生成乙個**物件。只有在**物件之間進行呼叫時,可以觸發切面邏輯。而在同乙個class中,方法b呼叫方法a,呼叫的是原物件的方法,而不通過**物件。所以spring無法切到這次呼叫,也就無法通過註解保證事務性了。
背景:由於springboot中預設是propagation_required,也就說「子方法」會使用"父方法"的事務,這樣當「子方法」丟擲異常,被"父方法"的事務捕獲,就會認為是"父方法"整個方法異常了,就會事務回滾,也就造成了2個方法都沒有插入進去資料。
解決辦法:在「子方法」加 @transactional(propagation = propagation.requires_new)
注:
如下幾個表示傳播行為的常量:
propagation_required:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。這是預設值。
propagation_requires_new:建立乙個新的事務,如果當前存在事務,則把當前事務掛起。
propagation_supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
transactiondefinition.propagation_not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
transactiondefinition.propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。
transactiondefinition.propagation_mandatory:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
transactiondefinition.propagation_nested:如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於propagation_required。
讀寫同乙個檔案出問題
在c primer plus 第六版中的第十三章程式設計練習第3題出現了問題。題目 編寫乙個檔案拷貝程式,提示使用者輸入文字檔案名,並以該檔名作為源檔名和輸出檔名。該程式要使用ctype.h中的toupper 函式,在寫入到輸出檔案時把所有文字轉換成大寫。使用標準的i o和文字模式。我一開始就只建立...
多執行緒併發同乙個表問題
table for update for update of a.id a1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 a,b直接封鎖a,b表...
在同乙個程式中結合C
在同乙個程式中結合c 和c 在同乙個程式中結合c 以及c我們需要注意的4大主題 1.name mangling 名稱重整 2.statics 靜態物件初始化 3.動態記憶體分配 4.資料結構的相容性。對於名稱重整 我們知道在c 中由於過載的存在我們需要對函式的名稱進行重整,但是c的函式我們就不需要重...