/** * 演示手动事务:转账操作(从 Alice 扣 200,给 Bob 加 200) */@TestvoidtestManualTransactionCommit()throwsSQLException{// 关闭自动提交,开启手动事务管理conn.setAutoCommit(false);assertFalse(conn.getAutoCommit(),"手动事务模式 autoCommit 应为 false");try(Statementstmt=conn.createStatement()){// 转账操作:Alice -> Bob 转 200stmt.executeUpdate("UPDATE accounts SET balance = balance - 200 WHERE id = 1");stmt.executeUpdate("UPDATE accounts SET balance = balance + 200 WHERE id = 2");// 手动提交事务conn.commit();System.out.println("转账事务已提交");// 验证转账结果ResultSetrs=stmt.executeQuery("SELECT owner, balance FROM accounts ORDER BY id");rs.next();assertEquals(800.0,rs.getDouble("balance"),0.01,"Alice 余额应为 800(1000-200)");System.out.println(rs.getString("owner")+" 余额: "+rs.getDouble("balance"));rs.next();assertEquals(700.0,rs.getDouble("balance"),0.01,"Bob 余额应为 700(500+200)");System.out.println(rs.getString("owner")+" 余额: "+rs.getDouble("balance"));}}
/** * 演示事务回滚:转账到一半模拟异常,回滚保证数据一致性 */@TestvoidtestManualTransactionRollback()throwsSQLException{conn.setAutoCommit(false);try(Statementstmt=conn.createStatement()){// 第一步:从 Alice 扣 300stmt.executeUpdate("UPDATE accounts SET balance = balance - 300 WHERE id = 1");// 模拟异常发生(例如系统错误),此时 Bob 还未加钱// 为保证数据一致性,必须回滚booleansimulatedError=true;if(simulatedError){// 回滚事务:撤销所有未提交的更改conn.rollback();System.out.println("模拟异常,事务已回滚");}// 验证回滚后 Alice 余额未变conn.setAutoCommit(true);// 恢复自动提交以便查询ResultSetrs=stmt.executeQuery("SELECT balance FROM accounts WHERE id = 1");rs.next();assertEquals(1000.0,rs.getDouble("balance"),0.01,"回滚后 Alice 余额应恢复为 1000(未变)");System.out.println("回滚后 Alice 余额: "+rs.getDouble("balance"));}}