JDBC--如何回滚事务?

举报
Xxy_1008 发表于 2024/10/30 09:50:08 2024/10/30
【摘要】 基本原理当事务中的一个或多个操作出现错误,或者不符合业务逻辑要求时,需要回滚事务。回滚事务就是将数据库的状态恢复到事务开始之前的状态,撤销在该事务中已经执行的所有 SQL 操作对数据库产生的影响。这就好比在时间上 “倒退”,消除之前操作的痕迹。在 JDBC 中的具体操作步骤获取连接对象(Connection)首先要建立与数据库的连接,这是进行事务处理的基础。通过DriverManager类来...
  1. 基本原理
    • 当事务中的一个或多个操作出现错误,或者不符合业务逻辑要求时,需要回滚事务。回滚事务就是将数据库的状态恢复到事务开始之前的状态,撤销在该事务中已经执行的所有 SQL 操作对数据库产生的影响。这就好比在时间上 “倒退”,消除之前操作的痕迹。
  2. 在 JDBC 中的具体操作步骤
    • 获取连接对象(Connection)
      • 首先要建立与数据库的连接,这是进行事务处理的基础。通过DriverManager类来获取连接。例如,假设连接 MySQL 数据库,代码如下:
       Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");

  • 关闭自动提交(setAutoCommit (false))
    • JDBC 默认是自动提交模式,每条 SQL 语句执行后会自动提交事务。为了手动控制事务,需要关闭自动提交,将事务的控制权掌握在自己手中。通过连接对象进行设置,如下:
       connection.setAutoCommit(false);

  • 执行事务操作(可能会出现错误)
    • 接下来,在这个事务中执行一系列的 SQL 操作,这些操作可能会因为各种原因(如违反数据库约束、网络问题等)导致失败。例如,执行插入操作和更新操作:
       try {
         Statement statement = connection.createStatement();
         // 插入数据
         statement.executeUpdate("INSERT INTO employees (employee_id, name, department) VALUES (1001, 'John Doe', 'IT')");
         // 更新数据
         statement.executeUpdate("UPDATE departments SET head_count = head_count + 1 WHERE department_name = 'IT'");
       } catch (SQLException e) {
         e.printStackTrace();
       }

  • 回滚事务(rollback)
    • 如果在事务操作过程中出现了异常,就需要回滚事务。通过连接对象的rollback方法来实现。以下是一个完整的示例,包括异常处理和回滚:
       try {
         connection.setAutoCommit(false);
         Statement statement = connection.createStatement();
         // 插入数据
         statement.executeUpdate("INSERT INTO employees (employee_id, name, department) VALUES (1001, 'John Doe', 'IT')");
         // 更新数据
         statement.executeUpdate("UPDATE departments SET head_count = head_count + 1 WHERE department_name = 'IT'");
         // 假设在这里出现异常,比如违反了唯一约束
         //...
         connection.commit();
       } catch (SQLException e) {
         try {
           connection.rollback();
           System.out.println("事务已回滚");
         } catch (SQLException ex) {
           ex.printStackTrace();
         }
         e.printStackTrace();
       }

  • 在这个例子中,如果在提交事务(connection.commit())之前出现了异常,就会进入catch块。在catch块中,会尝试通过connection.rollback()来回滚事务。如果回滚过程中也出现异常,会再次捕获并打印堆栈信息。

  1. 注意事项
    • 资源释放:无论是成功提交事务还是回滚事务后,都要记得关闭数据库连接等资源,以避免资源浪费和潜在的内存泄漏。通常在finally块中进行资源关闭操作,例如:
     finally {
       try {
         if (statement!= null) {
           statement.close();
         }
         if (connection!= null) {
           connection.close();
         }
       } catch (SQLException e) {
         e.printStackTrace();
       }
     }

  • 事务范围:要清楚事务的范围,确保在一个事务中执行的操作是逻辑上相关的,并且需要作为一个整体来处理成功或失败。例如,在一个电商订单处理场景中,订单商品的库存扣减和订单记录的创建应该在同一个事务中,以保证数据的一致性。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。