關於取消的spring 的事務管理web
工做上有個需求,讀取一個excel表的數據,並存入數據庫,可是有一個問題,每跳數據都是與其餘數據有關聯的,簡單的說就是,每插入一條時就會與數據庫其餘的數據比較,而後進行一些操做,因此一旦事務沒提交,數據庫的數據就沒有真正的插入進去,插入時數據確定是不正確的。spring
正確的思路就是取消事務,即在方法上寫一個註解 @Transactional(propagation=Propagation.NOT_SUPPORTED) 不開啓事務數據庫
@Transactional(propagation=Propagation.NOT_SUPPORTED) public String uploadExcel(InputStream inputXLS,String fitemId) throws Exception{ .... }
可是過了一段時間,出現問題了,不起做用了,發現有多是 web.xml 中的配置影響到了(大神的猜想),因爲這裏又不能改,只好想其餘的方法session
<filter> <filter-name>lazyLoadingFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter>
最後在網上找了一個解決方案spa
resourcePriceDao.saveOrUpdate(rp);
resourcePriceDao.getSessionFactory().getCurrentSession().flush();
每次保存後。調用當前的session的flush()方法強制與數據庫同步,固然這樣作會稍微影響效率,但需求是解決了。hibernate
若是有什麼更好的解決方案能夠討論下excel
一下是一些在網上找的關於事務的處理code
@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秒orm
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)//數據庫隔離級別xml