1. 程式人生 > 實用技巧 >spring boot + spring data jpa 事務失效

spring boot + spring data jpa 事務失效

配置:在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)


  • 方法不是public
    •   改唄


  • 資料庫表不是 innodb 引擎
    •   如果是jpa自動生成的表,需要配置一下表的預設引擎(在配置檔案中配置方言的方式已經被hibernate過時,官方建議在環境資訊或jvm中配置
      •   
            public static void main(String[] args) {
                //配置jpa生成表的預設引擎為innodb
                System.setProperty("hibernate.dialect.storage_engine","innodb");
                SpringApplication.run(NikeDcProcessorApplication.
        class, args); }