弹簧和线程:事务
為了能夠在我們的線程中使用事務(wù),我們需要了解事務(wù)如何在spring中工作。 spring中的事務(wù)信息存儲在ThreadLocal變量中。 因此,這些變量特定于單個線程上正在進(jìn)行的事務(wù)。
當(dāng)涉及由單個線程運(yùn)行的動作時,事務(wù)將在分層調(diào)用的Spring組件之間傳播。
因此,在產(chǎn)生線程的@Transactional帶注釋的服務(wù)的情況下,事務(wù)不會從@Transactional服務(wù)傳播到新創(chuàng)建的線程。 結(jié)果將是一個錯誤,指示缺少事務(wù)。
由于在線程內(nèi)進(jìn)行的操作需要通過jpa訪問數(shù)據(jù)庫,因此必須創(chuàng)建一個新事務(wù)。 通過查看@Transactional 文檔,我們可以獲得有關(guān)事務(wù)傳播類型的更多信息。 @Transactional的默認(rèn)傳播模式為REQUIRED 。
因此,通過使用@Transactional注釋方法,將創(chuàng)建一個新事務(wù)并將其傳播到從我們的線程調(diào)用的其他服務(wù)。
例如,我們的async方法可以注釋為Transactional
@Async @Transactional public void executeTransactionally() {System.out.println("Execute a transaction from the new thread"); }從Runnable類的run函數(shù)調(diào)用的方法也是如此。 盡管異步的使用非常簡單,但是在后臺,它會將調(diào)用包裝在Runnable中,然后將其分派給執(zhí)行者。
總結(jié)一下在Spring使用線程和事務(wù)時,應(yīng)該格外小心。 還請記住,事務(wù)不能在線程之間傳遞。 最后但并非最不重要的一點(diǎn)是,確保@Async和@Transactional函數(shù)是公共函數(shù),并通過將在調(diào)用之前進(jìn)行必要操作的代理。
翻譯自: https://www.javacodegeeks.com/2017/10/spring-threads-transactions.html
總結(jié)
- 上一篇: 奇变偶不变什么梗 奇变偶不变是啥梗
- 下一篇: 怎样发微博动态