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