事务:包含多个步骤的业务操作。若此业务操作被事务管理,则多个步骤要么同时成功,要么同时失败

    操作:

    1. 1. 开启事务
    2. 2. 提交事务
    3. 3. 回滚事务

    使用Connection对象来管理事务

    • 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
      1. - 在执行sql之前开启事务
    • 提交事务:commit()
      1. - 当所有sql都执行完提交事务
    • 回滚事务:rollback()
      1. - catch中回滚事务 ( 一般事务出现问题时回滚 )


    1. /**
    2. * 事务操作: 举例银行转账业务
    3. */
    4. public class JDBCDemo {
    5. public static void main(String[] args) {
    6. Connection conn = null;
    7. PreparedStatement pstmt1 = null;
    8. PreparedStatement pstmt2 = null;
    9. try {
    10. //1.获取连接
    11. conn = JDBCUtils.getConnection();
    12. //开启事务
    13. conn.setAutoCommit(false);
    14. //2.定义sql--------------------------------------------
    15. //2.1 张三 - 500
    16. String sql1 = "update account set balance = balance - ? where id = ?";
    17. //2.2 李四 + 500
    18. String sql2 = "update account set balance = balance + ? where id = ?";
    19. //------------------------------------------------------
    20. //3.获取执行sql对象
    21. pstmt1 = conn.prepareStatement(sql1);
    22. pstmt2 = conn.prepareStatement(sql2);
    23. //4. 设置参数
    24. pstmt1.setDouble(1,500);
    25. pstmt1.setInt(2,1);
    26. pstmt2.setDouble(1,500);
    27. pstmt2.setInt(2,2);
    28. //5.执行sql
    29. pstmt1.executeUpdate();
    30. // 手动制造异常
    31. int i = 3/0;
    32. pstmt2.executeUpdate();
    33. //提交事务
    34. conn.commit();
    35. } catch (Exception e) {
    36. //事务回滚
    37. try {
    38. if(conn != null) {
    39. conn.rollback();
    40. }
    41. } catch (SQLException e1) {
    42. e1.printStackTrace();
    43. }
    44. e.printStackTrace();
    45. }finally {
    46. JDBCUtils.close(pstmt1,conn);
    47. JDBCUtils.close(pstmt2,null);
    48. }
    49. }
    50. }