關於取消的spring 的事務管理

  關於取消的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

相關文章
相關標籤/搜索