版权声明:转载请注明原始链接 https://blog.csdn.net/sswqzx/article/details/82731676
学习目标
Mysql事务操作
JDBC事务操作
一、Mysql事务操作
事务 Transaction : 将一组 sql 语句作为一个整体, 要成功, 一起成功, 如果失败, 全部失败.
1、准备数据 :
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
money DOUBLE
);
-- 添加数据
INSERT INTO account (name, money) VALUES ('Jack', 1000), ('Rose', 1000);
2、MySQL 的事务操作 :
MySQL 数据库将每条 SQL 指令设置默认设置为 `自动提交`. 一旦指令提交, 数据库中的数据就会发生 `永久性` 的改变.
- 开启事务. start transaction; 开启事务其实开启 MySQL 数据库的 `手动提交`.
- 提交事务. commit;
- 回滚事务. rollback;
一旦事务开启后, 无论最终调用的是 `commit / rollback`, 该事务都结束了.
二、JDBC的事务操作
1、JDBC 的事务操作 :
请问 : Java中 JDBC 操作数据库, 将事务交给了哪个类的对象呢 ??? Connection连接对象
- setAutoCommit(false); 不要自动提交, 就是开启事务.
- commit(); 成功, 执行提交.
- rollback(); 失败, 执行回滚.
代码实现 :
public class TransactionTest1 {
public static void main(String[] args) {
/*
JDBC 中交给了 Connection 对象.
1. setAutoCommit(false); 不要自动提交
2. commit(); 提交.
3. rollback(); 回滚.
*/
// 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);
}
}
}