加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么我必须在JDBC中使用回滚?

发布时间:2020-12-15 08:26:55 所属栏目:Java 来源:网络整理
导读:如果我不使用connection.rollback(),由于事务尚未提交,我可以看到数据库的数据也不会改变任何东西,那为什么我仍然需要使用connection.rollback()? try { connection.setAutoCommit(false); bankDao.transferMoney(+2000,1,connection); //account1:+$2000 i
如果我不使用connection.rollback(),由于事务尚未提交,我可以看到数据库的数据也不会改变任何东西,那为什么我仍然需要使用connection.rollback()?

try {

        connection.setAutoCommit(false);


        bankDao.transferMoney(+2000,1,connection); //account1:+$2000


        if(true){
            throw new RuntimeException(); //make error
        }

        bankDao.transferMoney(-2000,2,connection);//account2:-$2000


        connection.commit();

    } catch (Exception e) {

        try {

            connection.rollback();
            System.out.println("something wrong,roll back");

        } catch (Exception e1) {

            e1.printStackTrace();

        }

    }

解决方法

您需要显式回滚以确保事务结束.如果您没有显式提交或回滚,那么 – 如果继续使用连接 – 稍后可能会由应用程序的其他部分意外提交更改.明确回滚可以防止这种情况发生.

在其他情况下,连接关闭将结束事务.但是,它是特定于驱动程序的,无论连接关闭是提交还是回滚事务. Connectionc.close()文档说:

It is strongly recommended that an application explicitly commits
or rolls back an active transaction prior to calling the close method.
If the close method is called and there is an active transaction,
the results are implementation-defined.

未明确回滚您的交易也可能导致交易持续时间超过必要,持有锁等可能阻止其他交易完成其工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读