1遇到問題: spring 事務中儲存了物件後 啟動乙個執行緒獲取物件無效
public void postdispatchdoc(dispatchdoc entity) catch (exception e)
}
public void run() catch (exception e)
}
寫web專案的時候,我們一般在service層中啟用事務。在乙個事務當中,只有方法執行完畢才會提交結果到資料庫。而在service中方法中呼叫另個乙個執行緒,另外乙個執行緒不在當前事務中,有肯能在事務還沒有提交前就已經執行。
mysql預設的事務隔離級別是 repeatable-read 對照下面可以檢視出,mysql不可能dirty read & nonrepeatable read 有可能 phantom read
那麼具體是什麼意思呢?
1、髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料
2、不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。
3、幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
看了解釋時候還是不懂通俗的說mysql預設就是:事務a操作了資料庫的同時,b也操作,若b未提交。a讀取不到。b提交後,a才能獲取。除非a統計資料時b在此期間插入一條資料。如果考慮這種情況需要將資料庫設定成序列化設定方式如下:
set session transaction isolation level serializable;
檢視當前資料庫的隔離級別:
現在總數弄明白了,mysql的事務原理。當啟動乙個執行緒後另乙個執行緒讀取不到未提交的資料。
*一般邊緣的操作,通常會設定成為非同步的,以提公升效能,比如傳送mq,業務系統負責事務成功後訊息傳送成功,然後接收系統負責保證通知成功完成。以上的業務即使能獲取到業務,也要保證提交成功否則回退後發簡訊無效。
如何在spring事務提交之後進行非同步操作,這些非同步操作必須得在該事務成功提交後才執行,回滾則不執行
//該方法就可以實現在事務提交之後進行操作
public void insert(techbook techbook)});
threadlocalrandom random = threadlocalrandom.current();
if(random.nextint() % 2 ==0)
system.out.println("service end");
}
Spring資料庫事務管理
事務 transaction 是併發控制的基本單位。所謂的事務,它是乙個操作序列,這些操作要麼都執行,要麼都不執行,它是乙個不可分割的工作單位。例如,銀行轉賬工作 從乙個賬號扣款並使另乙個賬號增款,這兩個操作要麼都執行,要麼都不執行,在關聯式資料庫中,乙個事務可以是一條sql語句 一組sql語句或整...
深入Spring資料庫事務管理
相關問題 一 transactional的失效問題 1.對於靜態 static 方法和非public方法,註解 transactional是失效的。2.自呼叫,就是乙個類的乙個方法去呼叫自身另外乙個方法的過程。如下 autowired private roledao roledao transact...
Spring與事務管理
整合事務管理 編碼方式管理事務 使用宣告式事務 以註解的方式描述事務 1 理解事務 事務的4個要素及其工作原理。acid 原子性 atomic 事務是由乙個或者多個活動組成的乙個工作單元。原子性確保事務中的所有操作全部發生 成功 或者全部不發生 回滾 一致性 consistent 一旦事務完成 不管...