之前我们是使用MySQL的命令来操作事务。接下来我们使用JDBC来操作银行转账的事务。
MySQL 学习笔记(1)
JDBC 的事务操作 :
请问 : JDBC 中, 事务交给了哪个对象 ???
回答 : Connection 对象来操作.
1. conn.setAutoCommit(false); 设置不要自动提交. (开启事务)
2. conn.commit(); 提交事务. (try 语句的最后一步执行)
3. conn.rollback(); 回滚事务. (catch 块中, 一旦发生异常, 以前的操作全部取消)
代码实现方法
public class TransactionTest1 {
public static void main(String[] args) {
// 1. 模拟数据
String outUser = "Jack";
String inUser = "Rose";
int money = 1000;
Connection conn = null;
PreparedStatement stmt = null;
try {
// 2. 建立连接
conn = JDBCUtils.getConnection();
// 第一步 : 开启事务
conn.setAutoCommit(false);
// 3. 操作数据
// 3.1 转出
String sql1 = "update account set money = money - ? where name = ?;";
// 预编译
stmt = conn.prepareStatement(sql1);
// 设置参数
stmt.setInt(1, money);
stmt.setString(2, outUser);
// 执行
int count = stmt.executeUpdate();
System.out.println("count = " + count);
// int num = 10 / 0; // Arithmetic Exception 算术异常
// 3.2 转入
String sql2 = "update account set money = money + ? where name = ?;";
// 预编译
stmt = conn.prepareStatement(sql2);
// 设置参数
stmt.setInt(1, money);
stmt.setString(2, inUser);
// 执行
count = stmt.executeUpdate();
System.out.println("count = " + count);
// 第二步 : 提交事务
conn.commit();
System.out.println("转账成功!");
} catch (Exception e) {
e.printStackTrace();
// 第三步 : 回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
System.out.println("转账失败!");
} finally {
// 4. 释放资源
JDBCUtils.release(conn, stmt);
}
}
}