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();

你可能感兴趣的:(基础类)