0
点赞
收藏
分享

微信扫一扫

JDBC中的事务 #yyds干货盘点#

语法:

try{
     conn.setAutoCommit(false);//开启事务
     ......
     conn.commit();// try的最后提交事务 (注意:一定要在最后一条语句才提交事务)     
} catch() {
    conn.rollback();//回滚事务
} finally {
    conn.setAutoCommit(true); // 还原事务的提交方式
    conn.close();
}

注意一定要在try语句块的最后一条语句才提交事务,否则,不管业务代码是否抛出异常,都会设置事务自动提交,都会提交异常之前的业务代码。

示例

public static void main(String[] args) throws SQLException {
    Connection conn = DBUtil.getConnection();
    try {
        conn.setAutoCommit(false); // 设置事务提交为手动
        Statement stmt1 = conn.createStatement();
        stmt1.executeUpdate("insert into tb_dept (dname,loc) values('a','aaaaa')");
        System.out.println(3 / 0);
        Statement stmt2 = conn.createStatement();
        stmt2.executeUpdate("insert into tb_dept (dname,loc) values('b','bbbbb')");
        conn.commit();  //最后一条语句提交事务
    } catch (SQLException e) {
        conn.rollback();
        e.printStackTrace();     
    }  finally {
        if(conn!=null){
           conn.setAutoCommit(true); // 还原事务的提交方式
           conn.close();
        }
   }
}

说明

如果不把事务提交放在try语句块的最后,会报错:

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = DBUtil.getConnection();
            conn.setAutoCommit(false);//开启事务

            String nickname = "aa";
            String account = "aaaaaaa";

            String sql = "insert into tb_user (nickname,account) values(?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, nickname);
            ps.setString(2, account);

            ps.executeUpdate();
            conn.commit(); //try的最后提交事务

            System.out.println(3 / 0);  // 报错
        } catch (SQLException e) {
            try {
                conn.rollback();//回滚事务
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            try {
                conn.setAutoCommit(true); // 还原事务的提交方式
                DBUtil.release(null, ps, conn);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

上面代码,程序报错,但仍然能将数据提交到数据库

举报

相关推荐

0 条评论