概述
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 事务的回滚 提交所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复