使用事务保证转账的可靠性
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransTest01 {
//1.tom向jack 转账 500元
//使用事务,保证转账的可靠性
//1.保证每条DML都不自动提交
//2.保证执行两次sql公用一个连接
public static void main(String[] args){
Connection con = null;
try {
con = JDBCUtils.getConnection();
//取消事务的自动提交
con.setAutoCommit(false);
String sql = "update user set money = money - 500 where name = ?";
TransTest01.excuteDBTran(con,sql,"tom");
//模拟产生网络异常
System.out.println(100/0);
String sql1 = "update user set money = money + 500 where name = ?";
TransTest01.excuteDBTran(con,sql1,"jack");
System.out.println("转账成功");
} catch (Exception e) {
System.out.println("交易过程中发生异常,交易终止...");
try {
con.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}finally {
try {
con.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
TransTest01.closeConnection(con);
}
}
/**
* 考虑事务后的通用增删改方法
* @param sql sql语句
* @param args 填充占位符参数
* @throws Exception
*/
public static void excuteDBTran(Connection con,String sql,Object ...args) {
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql);
for (int i=0;i
ps.setObject(i+1, args[i]);
}
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeConnection(null, ps);
}
}
/**
* 关闭资源
* @param con 连接对象
*/
//关闭资源
public static void closeConnection(Connection con){
try {
if(con != null)
con.close();
}catch (Exception e){
e.printStackTrace();
}
}
}