使用JDBC控制事务

使用JDBC控制事务

实际应用中有时候会遇到一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。现在我们使用JDBC来操作数据库,那么需要在JDBC中控制事务,JDBC中我们使用Connection对象来管理事务。

  • 开启事务:setAutoCommit(boolean autoCommit) :传入false为手动开启事务

    • 在执行sql之前开启事务
  • 提交事务:commit()

    • 当所有sql都执行完提交事务
  • 回滚事务:rollback()

    • 在catch中回滚事务

下面使用JDBC程序模拟转账的操作,中间手动制造一个异常,因为程序出现了异常,所以事务要回滚,即在catch中要进行事务的回滚操作。倘若程序没有进入到catch中,则提交事务。最后不要忘了关闭相关资源。

代码示例:

@Test
public void testTransaction() {
    Connection conn = null;
    PreparedStatement pstmt1 = null;
    PreparedStatement pstmt2 = null;

    // 获取连接Connection
    try {
        conn = DBUtil.getConnection();
        //手动开启事务
        conn.setAutoCommit(false);

        String sql1 = "update t_bank set money=? where account=?;";
        String sql2 = "update t_bank set money=? where account=?;";
        // 得到执行sql语句的对象PreparedStatement
        pstmt1 = conn.prepareStatement(sql1);
        pstmt2 = conn.prepareStatement(sql2);

        //设置参数
        pstmt1.setInt(1, 500);
        pstmt1.setInt(2, 1001);

        pstmt2.setInt(1, 2500);
        pstmt2.setInt(2, 1002);

        //执行sql
        pstmt1.executeUpdate();

        //手动制造异常
        System.out.println(10 / 0);
        pstmt2.executeUpdate();

        //提交事务
        conn.commit();
    } catch (Exception e) {
        //如果出现异常,则回滚事务
        if (conn != null) {
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        e.printStackTrace();
    } finally {
        try {
            if (conn != null) {
                conn.close();
            }
            if (pstmt1 != null) {
                pstmt1.close();
            }
            if (pstmt2 != null) {
                pstmt2.close();
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
    }

}