spring boot + spring data jpa 事務失效
阿新 • • 發佈:2020-07-31
配置:在service層的具體方法上開啟事務:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service public class InventoryServiceImpl implements InventoryService { @Autowired private DemoDao dao;@Override @Transactional public void add(Entity entity){ //TODO
dao.save(entity);
}
事務失效的原因可能有以下三個
- 異常相關
- 自己在方法內捕獲了異常,但是沒有丟擲,這時候事務aop捕獲不到異常,就不會執行回滾操作了。
- 解決:捕獲處理異常後,再往外丟擲
- 方法丟擲了spring事務不處理的異常,spring事務預設只處理RuntimeException Error兩種異常
- 解決:配置rollbackFor,指定事務捕獲哪些異常
@Transactional(rollbackFor = Exception.class)
- 解決:配置rollbackFor,指定事務捕獲哪些異常
- 自己在方法內捕獲了異常,但是沒有丟擲,這時候事務aop捕獲不到異常,就不會執行回滾操作了。
- 方法不是public
- 改唄
- 資料庫表不是 innodb 引擎
- 如果是jpa自動生成的表,需要配置一下表的預設引擎(在配置檔案中配置方言的方式已經被hibernate過時,官方建議在環境資訊或jvm中配置)
-
public static void main(String[] args) { //配置jpa生成表的預設引擎為innodb System.setProperty("hibernate.dialect.storage_engine","innodb"); SpringApplication.run(NikeDcProcessorApplication.
-
- 如果是jpa自動生成的表,需要配置一下表的預設引擎(在配置檔案中配置方言的方式已經被hibernate過時,官方建議在環境資訊或jvm中配置)