JDBC事务实现

使用 JDBC 连接 mysql 默认每一个连接是自动提交事务的。如果需要使用 JDBC 执行多条语句,并要求组成一个事务一起执行的话
1 、在执行之前关闭自动提交,设置手动提交事务 Connection 的对象 .setAutoCommit(false)
2 、如果执行成功,手动提交事务 Connection 的对象 .commit();
3 、如果执行过程中出现异常,则手动回滚撤销操作 Connection 的对象 .rollback();
4 、补充说明:希望养成习惯,在关闭 Connection 的对象之前,把连接对象设置回自动提交,
Connection 的对象 .setAutoCommit(true)
因为实际开发中,每次获取的连接,不一定是新的连接,而是从连接池中获取的旧的连接,而且关闭也不是真关闭,而是还给连接池,供别人接着用。以防别人拿到后,以为是自动提交的,而没有commit ,最终数据没有成功。一般涉及到事务处理的话,那么业务逻辑都会比较复杂。例如购物车结算时, 1 )在订单表中添加一条记录。2 )在订单明细表中添加多条订单明细的记录,表示该订单买了什么东西。 3 )修改商品表的销量和库存量。
用两条修改语句来模拟组成一个简单的事务。
update t_department set description = 'xx' where did = 2;
update t_department set description = 'yy' where did = 3; 
希望这两个语句要么一起成功,要么一起回滚。为了制造失败,可以故意把第二条语句写错 update t_department set description = 'yy' (少了 where did = 3 ;
Connection conn = null;
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    conn = DriverManager.getConnection("jdbc:mysql:///test?serverTimezone=UTC","root", "123456");
// 默认情况下单语句单事务,如果需要手动定义事务范围,则需要关系自动提交
    conn.setAutoCommit(false);
    PreparedStatement ps = conn.prepareStatement("insert into t1 values(?,?)");
    ps.setInt(1, 125);
    ps.setString(2, "xxx5");
    int len = ps.executeUpdate();
    ps.setObject(1, "tttt");//数据类型错误
        ps.setString(2, "66666");
    ps.executeUpdate();
    conn.commit();// 提交事务
} catch (Exception e) {
if (conn != null)
    conn.rollback();//回滚撤销事务
    System.out.println(e.getMessage());
} finally {
//如果使用直连方式,conn是否恢复原来的提交方式都没有关系;如果使用连接池则必须恢复原来的自动提交
方式
    if (conn != null)
        conn.close();
}

你可能感兴趣的:(mysql,数据库,java)