加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

springMVC之@Transactional批量执行更新语句方式

(2016-11-14 10:40:10)
标签:

spring

transactional

事物

分类: Java

在朋友一个项目中遇到这样的情况,项目使用的是springMVC,但是持久层使用的是mybatis
而且朋友封装了一些公用方法在dao层或者daoProvider层书写SQL,
但是我发现并没有像jdbcTemplate中的batchUpdate,
这样你在处理执行多条update语句的时候该怎么做呢

你可以在service层做处理使用@Transactional(spring 事物处理:注解方式)

    @Override
    @Transactional(rollbackFor=Exception.class)
    public void updateSalePrices(List> mapList) {
        for(Map map : mapList){
            Long id = Long.parseLong(map.get("id").toString());
            BigDecimal salePrice = new BigDecimal(map.get("salePrice").toString());
            storeDao.updateSalePrices(id,salePrice);
        }
    }
@Transactional(rollbackFor=Exception.class) ://当遇到异常时事物进行回滚
@Transactional(noRollbackFor=Exception.class)://当遇到异常时事物不进行回滚
rollbackFor & noRollbackFor 可别使用错啊
再扩展一些吧:
// 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
    @Transactional(propagation=Propagation.REQUIRED) 
    // 容器不为这个方法开启事务
    @Transactional(propagation=Propagation.NOT_SUPPORTED)
    // 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    // 必须在一个已有的事务中执行,否则抛出异常
    @Transactional(propagation=Propagation.MANDATORY)
    // 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
    @Transactional(propagation=Propagation.NEVER) 
    // 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
    @Transactional(propagation=Propagation.SUPPORTS)
RT:
这时候如果你执行其中一条update的时候报错了,报错的那条肯定执行不成功,剩余的不会执行,已执行过的会进行回滚,而且不必担心在for循环里面执行脚本,因为有了@Transactional
不论几条SQL他是一个事物提交的。
但是需要注意的一点是:
在这个方法里面不要加 try catcha
否则
@Transactional
捕获不到异常就不会回滚啦!
两外加几个扩展资料大家可以延伸一下以及怎么去配置Spring的事物
http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html(推荐
http://www.cnblogs.com/caoyc/p/5632963.html
https://my.oschina.net/guanzhenxing/blog/214228

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有