需求

  1. 因为公司资金紧张,所以需要移除IT这个部门,即在dept部门表中删除IT部门,也要在emp员工表中删除职位为IT的员工,这两个表没有做任何的外键约束,所以不能通过级联的方式删除,只能依靠事务来实现

代码演示

  1. java代码如下 ```java package com.wisdom.java02;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement;

public class TransactionTest { public static void main(String[] args) throws Exception{ // 注册驱动 Class.forName(“com.mysql.jdbc.Driver”);

  1. // 连接数据库
  2. String url = "jdbc:mysql://192.168.160.131:3306/subquery";
  3. Connection conn = DriverManager.getConnection(url,"root","数据库密码");
  4. // 设置手动提交事务
  5. conn.setAutoCommit(false);
  6. // 操作数据库
  7. String deleteDept = "delete from dept where deptno = ?";
  8. String deleteEmp = "delete from emp where deptno = ?";
  9. PreparedStatement deptPre = conn.prepareStatement(deleteDept);
  10. PreparedStatement empPre = conn.prepareStatement(deleteEmp);
  11. deptPre.setObject(1, 50);
  12. empPre.setObject(1, 50);
  13. // 出现异常就回滚
  14. try{
  15. int deptLen = deptPre.executeUpdate();
  16. int empLen = empPre.executeUpdate();
  17. // 两个都成功就提交,只要有一个执行步成功就回滚
  18. if(deptLen>0 && empLen>0 ){
  19. conn.commit();
  20. }else{
  21. conn.rollback();
  22. }
  23. }catch(Exception e){
  24. System.out.println("执行出现异常,事务回滚");
  25. conn.rollback();
  26. }
  27. deptPre.close();
  28. empPre.close();
  29. conn.setAutoCommit(true);
  30. conn.close();
  31. }

}

```

注意点

  1. 在操作完成后需要将事务再次修改为自动提交,因为后续的数据库连接可能使用数据库连接池来获取,如果没有恢复,其他人拿到这个连接进行的任何操作没有手动提交的都不会生效