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

Jim*_*mmy 4 java jdbc

如果我不使用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();

        }

    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 5

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

在其他情况下,连接关闭将结束事务。然而,连接关闭是提交还是回滚事务取决于驱动程序。该Connectionc.close()文件说:

强烈推荐该应用程序显式提交或回滚调用Close方法之前备份活动事务。如果close调用该方法并且存在活动事务,则结果是实现定义的。

不明确回滚你的事务也可能导致事务比需要的时间长,持有锁等可能会阻止其他事务完成它们的工作。


小智 2

你说得对,发生异常时数据不会提交,事务最终会被数据库回滚。

InnoDB内部有隐式的错误回滚,InnoDB错误处理,但除非你真正理解所有场景,否则显式调用connection.rollback()可以确保事务尽早结束(回滚)。请注意,当您调用提交或回滚时,事务就会结束​​。

在示例代码中,如果异常出现在 commit() 以外的行(例如由于某种原因bankDao.transferMoney)怎么办?

您需要回滚来结束事务。