mysql事务中出现异常没有被捕获_JDBC事务中,我明明只捕获了Exception,为什么当出现Error时也能保证数据正确呢?...

JDBC事务中,我明明只捕获了Exception,为什么当出现Error时也能保证数据正确呢?

我学习的内容:Java + JDBC + MySQL

代码逻辑很简单:捕获了SQLException:如果出现SQLException就回滚。

但是我发现,即使出现了我没有声明要捕获的ArithmeticException和StackOverflowError,数据仍然没有变化。

就好像是捕获到了我未声明的异常,然后自动回滚了一样。

即使我不用PrepareStatement,而用Statement也是一样的结果。

去看过源码了,也打了断点调试了半天,被淹死在源码里了…

请问这是什么原理呢?

菜鸟一只,恳请大佬赐教。

感谢!

代码如下:

public class Demo06_Transaction {

public static void main(String[] args) {

String sql_zhangsan = "UPDATE tb01_jdbc SET balance=balance+? WHERE name=?";

String sql_lisi = "UPDATE tb01_jdbc SET balance=balance-? WHERE name=?";

Connection conn = null;

PreparedStatement pstmt_zhangsan = null;

PreparedStatement pstmt_lisi = null;

try {

conn = JDBCUtils.getConn();

// 开启事务

conn.setAutoCommit(false); // 这里逻辑是不设置为自动提交,即手动开启了事务

// zhangsan增加200

pstmt_zhangsan = conn.prepareStatement(sql_zhangsan);

pstmt_zhangsan.setInt(1, 200);

pstmt_zhangsan.setString(2, "zhangsan");

pstmt_zhangsan.executeUpdate();

System.out.println("张三账户里增加了200");

// 在此处制造ArithmeticException

int i = 1 / 0;

// 在此处制造Error,仍然能够保证数据正确 zz 原因不知道

methodA(); // Exception in thread "main" java.lang.StackOverflowError

// lisi减少200

pstmt_lisi = conn.prepareStatement(sql_lisi);

pstmt_lisi.setInt(1, 200);

pstmt_lisi.setString(2, "lisi");

pstmt_lisi.executeUpdate();

System.out.println("李四账户里减少了200");

// 提交事务

conn.commit();

} catch (SQLException e) { //

e.printStackTrace();

// 出现异常,回滚事务

try {

if (conn != null) {

conn.rollback();

System.out.println("数据已回滚"); // 出现了未声明要获取的StackOverflowError、ArithmeticException时确实没有运行

}

} catch (SQLException ex) {

ex.printStackTrace();

}

} finally {

JDBCUtils.close(pstmt_zhangsan, conn);

JDBCUtils.close(pstmt_lisi, conn);

}

}

// 无限递归制造Error

private static void methodA() {

methodA(); // Exception in thread "main" java.lang.StackOverflowError

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值