您当前的位置: 首页 > 

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDBC中的事务

梁云亮 发布时间:2019-11-12 18:49:50 ,浏览量:1

JDBC中的事务

相关理基础:数据库事务 相关博客:JDBC工具类

语法:
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();
            }
        }
    }

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

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0495s