/**
*实现事务:Tom 对Jerry 转账500元
*
*/
public class TransactionTest {
public static void update(Connection conn,String sql,Object ... args){
PreparedStatement pstmt = null;
try{
pstmt = conn.prepareStatement(sql);//通过SQL语句 创建PreparedStatement 对象。
//利用 for 循环对 SQL 语句中的 PreparedStatement 占位符 ,更新数据。
for(int i = 0;i < args.length;i++){
pstmt.setObject((i+1), args[i]);
}
//更新执行。
pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭数据库连接。
JDBCTools.release(null, pstmt, null);
}
}
public static void main(String[] args) {
Connection conn = null;
try{
conn = JDBCTools.getConnection();
//取消默认的提交方式
conn.setAutoCommit(false);
String sql = "UPDATE user SET balance = balance - 500 WHERE id = 2000001";
update(conn, sql);
/*此处会 报com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,Table 'ming.users' doesn't exist
但是,整个事务却没有回滚。*/
sql = "UPDATE users SET balance = balance + 500 WHERE id = 2000002";
update(conn,sql);
//若事务操作正常,则提交事务
conn.commit();
} catch(Exception e){
//若事务操作出现异常,则需要在异常处理中回滚事务
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
JDBCTools.release(null, null, conn);
}
}
}
我刚才写了一些代码,自己建了一个数据库表usertable,字段为id,name,进行了测试。
我先在你的代码中加入一些文字说明。好看出代码运行的地方。
更新成功的结果如下:
更新失败的结果如下(当然,我是故意设置和你一样异常的结果,即找不到该数据库表):
结果表明,无论成功或是失败,都执行了提交操作。
后来我将你的update方法注释掉,并将其具体代码放在了main方法中,如下图。
结果就成功了。
我猜想是你的update方法已经对该方法可能出现的异常做出了异常处理,所以对于Main函数的try就无法捕获异常,所以就认为是没有问题的,就一直这么执行下去了。
这个我也是想了挺久的,不知道有没有想对,但愿对你有帮助。
报的语法错误,(user表能创建?)users表不存在,批量处理用addbatch()吧?这样才体现整体性
可能第二个sql语句中表users不存在,没法回滚!
如果对你有帮助,就回复我一声呗。我刚在这里回答问题不久,基本回答了就没有回应,所以不知道这样做有没有用。
图片说明](https://img-ask.csdn.net/upload/201701/18/1484670149_116611.png)