关于取消的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)//数据库隔离级别
新鲜出炉的小白,有什么不对的地方请指出来,欢迎大家讨论