事务--实操演示
目录
一、准备工作
二、在MySQL中操作事务(重点)
第一种方式:使用命令的方式
第二种方式:设置MySQL事务不默认提交的方式
结
三、在JDBC中操作事务(掌握)
第一种方式:使用命令的方式
第二种方式:设置MySQL事务不默认提交的方式
在这篇Mybatis---事务_mybits事务-CSDN博客 中有事务相关理论知识,在此实操演示一遍事务操作。
仍旧是以经典例子转账做演示:
一、准备工作
【win】+【R】 输入cmd;
进到终端后输入【mysql -u root -p】然后输入密码;后续操作在这里展开演示。
输入【user】+【想要切换的数据库】
输入【show tables】查看所有表
可以看见我这个数据库中有这么多表。
二、在MySQL中操作事务(重点)
完成上述的准备工作后, 接下来就可以正常操作sql语句了:
e.g 先展示一下我们要演示操作的表吧!
我们将利用这个表模拟一个转账操作,其中张三给李四转1000元。下面是两种使用事务的方法的具体操作流程:
第一种方式:使用命令的方式
开启事务
START TRANSACTION;
执行转账操作
-
从张三账户扣除1000元
UPDATE account SET money = money - 1000 WHERE name = '张三';
-
给李四账户增加1000元
UPDATE account SET money = money + 1000 WHERE name = '李四';
提交事务
-
如果转账操作成功,提交事务
COMMIT;
-
如果转账操作失败,回滚事务
ROLLBACK;
第二种方式:设置MySQL事务不默认提交的方式
查看当前事务是否默认提交
SHOW VARIABLES LIKE 'autocommit';
设置MySQL的数据库的事务不默认提交
SET autocommit = 0;
执行转账操作
-
从张三账户扣除1000元
UPDATE account SET money = money - 1000 WHERE name = '张三';
-
给李四账户增加1000元
UPDATE account SET money = money + 1000 WHERE name = '李四';
手动提交或回滚事务
-
如果转账操作成功,提交事务
COMMIT;
-
如果转账操作失败,回滚事务
ROLLBACK;
恢复默认提交设置(可选)
SET autocommit = 1;
结
上面两种情况下,一旦有操作不成功的情况,就可以输入ROLLBACK;回滚到转帐前。
三、在JDBC中操作事务(掌握)
第一种方式:使用命令的方式
import java.sql.*;
public class TransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "yourusername";
String password = "yourpassword";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 开启事务
conn.setAutoCommit(false);
try {
// 从张三账户扣除1000元
String sql1 = "UPDATE account SET money = money - 1000 WHERE name = '张三'";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql1);
}
// 给李四账户增加1000元
String sql2 = "UPDATE account SET money = money + 1000 WHERE name = '李四'";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql2);
}
// 提交事务
conn.commit();
System.out.println("转账成功!");
} catch (SQLException e) {
// 回滚事务
conn.rollback();
System.out.println("转账失败,已回滚!");
e.printStackTrace();
} finally {
// 关闭连接
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
第二种方式:设置MySQL事务不默认提交的方式
import java.sql.*;
public class TransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/yourdatabase";
String user = "yourusername";
String password = "yourpassword";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 设置不默认提交
conn.setAutoCommit(false);
try {
// 从张三账户扣除1000元
String sql1 = "UPDATE account SET money = money - 1000 WHERE name = '张三'";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql1);
}
// 给李四账户增加1000元
String sql2 = "UPDATE account SET money = money + 1000 WHERE name = '李四'";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql2);
}
// 提交事务
conn.commit();
System.out.println("转账成功!");
} catch (SQLException e) {
// 回滚事务
conn.rollback();
System.out.println("转账失败,已回滚!");
e.printStackTrace();
} finally {
// 恢复默认提交设置
conn.setAutoCommit(true);
// 关闭连接
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
【注:yourdatabase
、yourusername
和yourpassword
对应实际数据库名称、用户名和密码,必要时请更改成自己对应的。】