【问题标题】:Java Transaction: how to stop program after rollback?Java Transaction:回滚后如何停止程序?
【发布时间】:2016-09-26 13:08:03
【问题描述】:

我有以下代码在 transaction 中执行数据库操作:

  try {
                //start transaction
                repository.startTransaction();

               //carry out deletion logic
                repository.deletedata()

                //commit all 3 transactions
                 repository.commitTransaction();

      }catch (Exception e) {    
                 repository.rollback();
            }

目前如果运行时有error,应用程序仍然继续运行。但是,我希望在数据回滚后停止程序的执行。

我怎样才能最好地做到这一点?

【问题讨论】:

    标签: java transactions execution rollback


    【解决方案1】:

    首先,要终止执行,您应该使用自己的业务级异常。

    其次,声明 repository.rollback(); 也可能失败。只是一个想法。

    我的做法是:

    class MyApp {
        public static final main(){
            new MyApp().run();
        }
    
        private void run(){
            MyRepositoryProcessor proc = new MyRepositoryProcessor();
    
            try {
                // Some loop here maybe...
                proc.deleteFromRepo();
            } catch (MyDatabaseCommunicationException ex) {
                System.exit(-1);
            }
        }
    }
    
    class MyRepositoryProcessor {
        public void deleteFromRepo() throws MyDatabaseCommunicationException {
            try {
                //start transaction
                repository.startTransaction();
    
                //carry out deletion logic
                repository.deletedata()
    
                //commit all 3 operations
                repository.commitTransaction();
    
            }catch (Exception e) {
                try {
                    repository.rollback();
                } catch (Exception ex){
                    // Database connection failed completely, could not even do a rollback.
                }
                throw new MyDatabaseCommunicationException("Deletion failed");
            }
        }
    }
    

    【讨论】:

    • 谢谢,虽然这如何停止程序执行?
    • 它会停止控制流的执行,直到您捕获到异常为止。如果你想完全退出程序,你绝对应该在数据库级别上做得更高。然后,您可以将 System.exit() 与一些适当的代码一起使用。
    • 好的,那么在数据库回滚后添加System.exit()?
    • 我更新了答案以更好地宣传我的想法。所以,是的, System.exit() 退出应用程序。不,您不应该在回滚后直接调用它。它应该从更高级别调用。
    • 为什么要上级调用?
    【解决方案2】:

    System.exit(0) ?

    你可以在这里找到一些文档http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

    【讨论】:

    • 谢谢,这是否只是阻止程序执行任何其他代码?
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2018-11-13
    • 2011-09-08
    • 2012-12-23
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多