参考:传智播客&黑马程序员
JDBC 事务的处理
之前我们是使用 MySQL 的命令来操作事务。接下来我们使用 JDBC 来操作银行转账的事务。
准备数据
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
--添加数据
INSERT INTO account(NAME,balance)VALUES('Jack',1000),('Rose',1000);
API 介绍
开发步骤
1.获取连接
2.开启事务
3.获取到 PreparedStatement
4.使用 PreparedStatement 执行两次更新操作
5.正常情况下提交事务
6.出现异常回滚事务
7.最后关闭资源
- 案例代码
package com.itheima;
import com.itheima.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo12Transaction {
//没有异常,提交事务,出现异常回滚事务
public static void main(String[] args) {
//1) 注册驱动
Connection connection = null;
PreparedStatement ps = null;
try {
//2) 获取连接
connection = JdbcUtils.getConnection();
//3) 开启事务
connection.setAutoCommit(false);
//4) 获取到 PreparedStatement
//从 jack 扣钱
ps = connection.prepareStatement("update account set balance = balance - ? where
name = ? ");
ps.setInt(1, 500);
ps.setString(2, "Jack");
ps.executeUpdate();
//出现异常
System.out.println(100 / 0);
//给 rose 加钱
ps = connection.prepareStatement("update account set balance = balance + ? where
name = ? ");
ps.setInt(1, 500);
ps.setString(2, "Rose");
ps.executeUpdate();
//提交事务
connection.commit();
System.out.println("转账成功");
} catch (Exception e) {
e.printStackTrace();
try {
//事务的回滚
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("转账失败");
} finally {
//7) 关闭资源
JdbcUtils.close(connection, ps);
}
}
}