需求
- 因为公司资金紧张,所以需要移除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();
}
}
注意点
- 在操作完成后需要将事务再次修改为自动提交,因为后续的数据库连接可能使用数据库连接池来获取,如果没有恢复,其他人拿到这个连接进行的任何操作没有手动提交的都不会生效