我是靠谱客的博主 愤怒流沙,最近开发中收集的这篇文章主要介绍JDBC 事务的回滚 提交,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


JDBC中,采用事务首先需要设定connection.setAutoCommit(false);JDBC事务开启的第一步,如果不设置,connection会自动提交事物.

rollback 和 commit的作用都完成对数据库的一次操作.并且释放当前的一些资源.
对于commit之后的事务,是不能够再进行回滚,但是对于回滚之后的失误,在不同的情况下却可以选择提交.

rollback()和rollback(Savepoint)的区别也就在于次.
这两方面方法会抛出SQLException,如果该事务为自动提交.即:
connection.setAutoCommint(true),或者是默认设置.

参看以下代码:


private String sql = "insert into t_transaction_test (name,value)  values(?,?)";


        pstm = conn.prepareStatement(sql);
        
        pstm.setString(1, "test9");
        pstm.setString(2, "test9");
        pstm.execute();
        Savepoint sp = conn.setSavepoint();
        
        pstm.setString(1, "test10");
        pstm.setString(2, "test10");
        pstm.execute();
        Savepoint sp2 = conn.setSavepoint();
        
        
        conn.rollback();
        conn.commit();
        System.out.println("Insert OK " + sp.getSavepointId());


在这段代码中,程序已经被rollback,因此接下来的commit()是没有任何意义的,但是如果将程序改为:

conn.rollback();
conn.commit(sp);

那么接下来的commit()将是有意义的,数据库中会记录第一条数据.

因此仔细考虑如下代码:

try{
...
tx.commit();
}catch(Exception e)
{
    tx.rollback();
}

在这段代码中,抛出的Exception一定是在commit()之前,或者在commit()执行没有完毕的情况下.

因此对于这样的代码:
try{
Savepoint sp=tx.setSavePoint();
...
tx.commit();
}catch(Exception e)
{
    ...
    tx.rollback(sp);
}

这样的回滚就显的没有任何的意义.
除非在tx.rollback(sp)之后继续进行tx.commit();

最后

以上就是愤怒流沙为你收集整理的JDBC 事务的回滚 提交的全部内容,希望文章能够帮你解决JDBC 事务的回滚 提交所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部