关于取消的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)//数据库隔离级别

 

新鲜出炉的小白,有什么不对的地方请指出来,欢迎大家讨论