//*****************************考虑数据库事务的转账操作*******************************
@Test
public void testUpdateWithtx() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
//取消数据的自动提交功能
conn.setAutoCommit(false);
String sql1 = "update user_table set balance = balance-100 where user=?";
update(conn,sql1,"AA");
//模拟网络异常
// System.out.println(10/0);
String sql2 = "update user_table set balance = balance+100 where user=?";
update(conn,sql2,"BB");
System.out.println("转账成功");
//提交数据
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} finally {
try {
conn.setAutoCommit(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
JDBCUtils.closeResource(conn,null);
}
}
//通用的增删改操作(考虑上事务的改进版本)
public int update(Connection conn,String sql ,Object...args){//sql中占位符的个数应该和可变形参的长度相同
PreparedStatement ps = null;
try {
//预编译sql语句 返回到PrepareStatement实例
ps = conn.prepareStatement(sql);
//填充 占位符
for (int i = 0; i < args.length ; i++) {
ps.setObject(i + 1 ,args[i]);
}
//4.执行
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null,ps);
}
return 0;
}
}