ACID [Atomicity, Consistency, Isolation, Durability] 原子性、一致性、隔离性、持久性
![]()
![]()
![]()
package further.zwf.acid; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /** * MySQL 事务示例:银行转账(原子性、一致性保证) * * @author ZengWenFeng * @date 2022.12.07 * @mobile 13805029595 * @email 117791303@QQ.COM */ public class MysqlTransactionDemo { // 数据库配置(改成你自己的) private static final String URL = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static void main(String[] args) { transfer(1001, 1002, 100.0); // 1001 给 1002 转 100 元 } /** * 转账方法(核心事务代码) * @param fromId 转出账户ID * @param toId 转入账户ID * @param money 转账金额 */ public static void transfer(int fromId, int toId, double money) { Connection conn = null; PreparedStatement deductStmt = null; PreparedStatement addStmt = null; try { // 1. 获取数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); // ========== 事务核心:关闭自动提交 ========== conn.setAutoCommit(false); // 2. 扣钱:转出账户 -money String deductSql = "UPDATE account SET balance = balance - ? WHERE id = ?"; deductStmt = conn.prepareStatement(deductSql); deductStmt.setDouble(1, money); deductStmt.setInt(2, fromId); deductStmt.executeUpdate(); // 模拟异常(打开测试回滚) // int error = 1 / 0; // 3. 加钱:转入账户 +money String addSql = "UPDATE account SET balance = balance + ? WHERE id = ?"; addStmt = conn.prepareStatement(addSql); addStmt.setDouble(1, money); addStmt.setInt(2, toId); addStmt.executeUpdate(); // ========== 全部成功:提交事务 ========== conn.commit(); System.out.println("转账成功!事务已提交"); } catch (Exception e) { // ========== 出现异常:回滚事务 ========== try { if (conn != null) { conn.rollback(); System.out.println("转账失败!事务已回滚"); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { // 关闭资源 try { if (deductStmt != null) deductStmt.close(); if (addStmt != null) addStmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }