使用JDBCTMEPLATE插入数据时,事务不回滚

    最近项目用到JDBCTEMPLATE,发现一个问题,当插入数据抛出异常时事务没有回滚,数据还是

保存进了数据库中。开始以为是事务配置问题。把SPRING各种配置都查了一遍,网上最多的就是

MVC的CONTROLLER配置文件和CONTEXT的SERVICE组件的扫描一定要分开。检查了之后发现

不是这个问题。后来各种测试,发现同一个方法,删除、修改的事务都可以回滚,只有保存的事务

不可以回滚,而保存的代码是网上拷贝的,需要返回生成的自增长主键,代码大意如下:

    final String sql = "INSERT INTO USER(NAME,PWD)VALUES(?,?)";
    KeyHolder keyHolder = new GeneratedKeyHolder();
		
    jdbcTemplate.update(new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection con)throws SQLException {
            PreparedStatement ps = jdbcTemplate.getDataSource().getConnection().prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            ps.setObject(1, user.getName());
            ps.setObject(2, user.getPwd());
            return ps;
        }
    }, keyHolder);
    return keyHolder.getKey().intValue();
    也许牛逼的哥们一眼就看出来问题了,不过哥还没怎么用过JDBCTEMPLATE,也没仔细看这段代码,

如果仔细看的话应该还是可以发现问题的。

    现在心里已经把问题定位到了是这个插入数据的问题,于是在网上又找了其它的方法,看看有没有

效果,大体代码如下:

    KeyHolder keyHolder = new GeneratedKeyHolder();
    //njt即NamedParameterJdbcTemplate
    njt.update(sql, new BeanPropertySqlParameterSource(user), keyHolder);
    return keyHolder.getKey().intValue();
    测试后,发现这样是支持事务的,遇到异常后,插入的数据被rollback了。而且这个方法可以直接用

对象给SQL附值,不需要写一堆的set,get,也算是一个收获吧。

    既然这个方法支持事务,那上面的那个方法为什么就不支持呢,难道是SPRING的BUG?想想还是先

找找自己的问题吧,现在才开始看这段网上拷贝来的代码,一眼就看到了一个刺目的getConnection(),

瞬间想到了问题所在,马上修改上面的代码,支持事务了,代码如下:

    final String sql = "INSERT INTO USER(NAME,PWD)VALUES(?,?)";
    KeyHolder keyHolder = new GeneratedKeyHolder();
		
    jdbcTemplate.update(new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection con)throws SQLException {
            PreparedStatement ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            ps.setObject(1, user.getName());
            ps.setObject(2, user.getPwd());
            return ps;
        }
    }, keyHolder);
    return keyHolder.getKey().intValue();
    相信大家现在也都看到问题了,他居然现成的CONNECTION不用,又去得到了一个新的CONNECTION,

新的CONNECITON当然不支持当前连接的事务。

    就是这个小问题搞了我一天,其实要是刚从网上拷来代码能看一眼,当时也就发现了,也不会浪费那么长

时间,大家以后到网上找代码之后还是要小心检查一下,说不定哪天就给你来个巨坑你就哭了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值