需求
- 因为公司资金紧张,所以需要移除IT这个部门,即在dept部门表中删除IT部门,也要在emp员工表中删除职位为IT的员工,这两个表没有做任何的外键约束,所以不能通过级联的方式删除,只能依靠事务来实现
代码演示
- 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”);
// 连接数据库String url = "jdbc:mysql://192.168.160.131:3306/subquery";Connection conn = DriverManager.getConnection(url,"root","数据库密码");// 设置手动提交事务conn.setAutoCommit(false);// 操作数据库String deleteDept = "delete from dept where deptno = ?";String deleteEmp = "delete from emp where deptno = ?";PreparedStatement deptPre = conn.prepareStatement(deleteDept);PreparedStatement empPre = conn.prepareStatement(deleteEmp);deptPre.setObject(1, 50);empPre.setObject(1, 50);// 出现异常就回滚try{int deptLen = deptPre.executeUpdate();int empLen = empPre.executeUpdate();// 两个都成功就提交,只要有一个执行步成功就回滚if(deptLen>0 && empLen>0 ){conn.commit();}else{conn.rollback();}}catch(Exception e){System.out.println("执行出现异常,事务回滚");conn.rollback();}deptPre.close();empPre.close();conn.setAutoCommit(true);conn.close();}
}
注意点
- 在操作完成后需要将事务再次修改为自动提交,因为后续的数据库连接可能使用数据库连接池来获取,如果没有恢复,其他人拿到这个连接进行的任何操作没有手动提交的都不会生效
