java jdbc 事务回滚

private Connection conn = null; 
private PreparedStatement ps = null; 
try{ 
    conn.setAutoCommit(false);  //将自动提交设置为false 
    ps.executeUpdate("修改SQL"); //执行修改操作 
    ps.executeQuery("查询SQL");  //执行查询操作                
    conn.commit();      //当两个操作成功后手动提交 
} catch (Exception e) { 
    conn.rollback();    //一旦其中一个操作出错都将回滚,使两个操作都不成功 
    e.printStackTrace(); 
}

JDBC对事务的支持体现在三个方面:
    1.自动提交模式(Auto-commit mode):Connection提供了一个auto-commit的属性来指定事务何时结束。当auto-commit为true时,当每个独立SQL操作的执行完毕,事务立即自动提交,也就是说每个SQL操作都是一个事务。一个独立SQL操作什么时候算执行完毕,JDBC规范是这样规定的:对数据操作语言(DML,如insert,update,delete)和数据定义语言(如create,drop),语句一执行完就视为执行完毕。对select语句,当与它关联的ResultSet对象关闭时,视为执行完毕。对存储过程或其他返回多个结果的语句,当与它关联的所有ResultSet对象全部关闭,所有update count(update,delete等语句操作影响的行数)和output parameter(存储过程的输出参数)都已经获取之后,视为执行完毕。当auto-commit为false时,每个事务都必须显示调用commit方法进行提交,或者显示调用rollback方法进行回滚。auto-commit默认为true。

    2.事务隔离级别(Transaction Isolation Levels):
        a.TRANSACTION_NONE JDBC驱动不支持事务
        b.TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读
        c.TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读
        d.TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
        e.TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。

    3.保存点(SavePoint):JDBC定义了SavePoint接口,提供在一个更细粒度的事务控制机制。当设置了一个保存点后,可以rollback到该保存点处的状态,而不是rollback整个事务。Connection接口的setSavepoint和releaseSavepoint方法可以设置和释放保存点。

    JDBC规范虽然定义了事务的以上支持行为,但是各个JDBC驱动,数据库厂商对事务的支持程度可能各不相同。如果在程序中任意设置,可能得不到想要的效果。为此,JDBC提供了DatabaseMetaData接口,提供了一系列JDBC特性支持情况的获取方法。比如,通过DatabaseMetaData.supportsTransactionIsolationLevel方法可以判断对事务隔离级别的支持情况,通过DatabaseMetaData.supportsSavepoints方法可以判断对保存点的支持情况。

猜你喜欢

转载自cnjarchen.iteye.com/blog/1668212