package com.luojie;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
模拟转账的 事物 , jdbc是每执行一条SQL语句都要提交一次事务
account 数据库中的t_act表
*/
public class JDBCTest10 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
//1注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/account","root","123456");
//将自动提交事务改成手懂提交事务
conn.setAutoCommit(false);
//3获取预编译操作对象
String sql = "update t_act set balance = ? where actno = ?";
ps = conn.prepareStatement(sql);
//给?传值
ps.setDouble(1,10000);
ps.setInt(2,111);
int count = ps.executeUpdate();
//这儿模拟了个异常
// String s = null;
// s.toString();
ps.setDouble(1,10000);
ps.setInt(2,222);
count += ps.executeUpdate();
System.out.println(count == 2?"转账成功":"转账失败");
//程序如果能走到这儿说明 事务没问题 手动提交事务
conn.commit();
} catch (ClassNotFoundException e) {
//出现异常手动回滚
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
if(ps !=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
JDBC单机事务案例
最新推荐文章于 2022-08-04 21:44:44 发布