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