關於取消的spring 的事務管理
工作上有個需求,讀取一個excel表的數據,並存入數據庫,但是有一個問題,每跳數據都是與其他數據有關聯的,簡單的說就是,每插入一條時就會與數據庫其他的數據比較,然后進行一些操作,所以一旦事務沒提交,數據庫的數據就沒有真正的插入進去,插入時數據肯定是不正確的。
正確的思路就是取消事務,即在方法上寫一個注解 @Transactional(propagation=Propagation.NOT_SUPPORTED) 不開啟事務
@Transactional(propagation=Propagation.NOT_SUPPORTED) public String uploadExcel(InputStream inputXLS,String fitemId) throws Exception{ .... }
但是過了一段時間,出現問題了,不起作用了,發現有可能是 web.xml 中的配置影響到了(大神的猜測),由於這里又不能改,只好想其他的方法
<filter> <filter-name>lazyLoadingFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter>
最后在網上找了一個解決方案
resourcePriceDao.saveOrUpdate(rp);
resourcePriceDao.getSessionFactory().getCurrentSession().flush();
每次保存后。調用當前的session的flush()方法強制與數據庫同步,當然這樣做會稍微影響效率,但需求是解決了。
如果有什么更好的解決方案可以討論下
一下是一些在網上找的關於事務的處理
@Transactional(propagation=Propagation.REQUIRED)//如果有事務,那么加入事務,沒有的話新創建一個
@Transactional(propagation=Propagation.NOT_SUPPORTED)//這個方法不開啟事務
@Transactional(propagation=Propagation.REQUIREDS_NEW)//不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
@Transactional(propagation=Propagation.MANDATORY)//必須在一個已有的事務中執行,否則拋出異常
@Transactional(propagation=Propagation.NEVER)//不能在一個事務中執行,就是當前必須沒有事務,否則拋出異常
@Transactional(propagation=Propagation.SUPPORTS)//其他bean調用這個方法,如果在其他bean中聲明了事務,就是用事務。沒有聲明,就不用事務。
@Transactional(propagation=Propagation.NESTED)//如果一個活動的事務存在,則運行在一個嵌套的事務中,如果沒有活動的事務,則按照REQUIRED屬性執行,它使用一個單獨的事務。這個書屋擁有多個回滾的保存點,內部事務的回滾不會對外部事務造成影響,它只對DataSource TransactionManager事務管理器起效。
@Transactional(propagation=Propagation.REQUIRED,readOnly=true)//只讀,不能更新,刪除
@Transactional(propagation=Propagation.REQUIRED,timeout=30)//超時30秒
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)//數據庫隔離級別