JDBC 控制事务
之前我们是使用 MySQL 的命令来操作事务。接下来我们使用 JDBC 来操作银行转账的事务
数据准备
-- 创建账户表
CREATE TABLE account(
-- 主 键
id INT PRIMARY KEY AUTO_INCREMENT,
-- 姓 名
NAME VARCHAR(10),
-- 转账金额
money DOUBLE
);
-- 添加两个用户
INSERT INTO account (NAME, money) VALUES ('tom', 1000), ('jack', 1000);
事务相关API
我们使用 Connection中的方法实现事务管理
方法 | 说明 |
void setAutoCommit(boolean autoCommit) | 参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务 |
void commit() | 提交事务 |
void rollback() | 回滚事务 |
开发步骤
- 获取连接
- 开启事务
- 获取到 PreparedStatement , 执行两次更新操作
- 正常情况下提交事务
- 出现异常回滚事务
- 最后关闭资源
代码示例
package com.lagou.jdbc04;
import com.lagou.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestJDBCTransaction {
//使用JDBC操作事务
public static void main(String[] args) {
Connection con = null;
PreparedStatement ps = null;
try {
//1.获取连接
con = JDBCUtils.getConnection();
//2.开启事务
con.setAutoCommit(false); //手动提交事务
//3.获取预处理对象 执行SQL (两次修改操作)
//3.1 tom账户 - 500
ps = con.prepareStatement("update account set money = money - ? where name = ?");
ps.setDouble(1,500.0);
ps.setString(2,"tom");
ps.executeUpdate();
//模拟 tom转账之后出现异常
System.out.println(1 / 0);
//3.2 jack账户 + 500
ps = con.prepareStatement("update account set money = money + ? where name = ?");
ps.setDouble(1,500.0);
ps.setString(2,"jack");
ps.executeUpdate();
//4.提交事务 (正常情况)
con.commit();
System.out.println("转账成功! !");
} catch (SQLException e) {
e.printStackTrace();
//5.出现异常就回滚事务
try {
con.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
} finally {
//6.释放资源
JDBCUtils.close(con,ps);
}
}
}
节选自拉钩教育JAVA系列教程