如何使一系列非数据库方法模仿事务。

时间:2013-05-01 20:31:05

标签: java transactions

我需要执行几个方法调用,需要“事务性”但我不确定如何在try / catch / finally之外实现它。

背景

  • 应用程序是基于控制台的。
  • 应用程序将有多个线程
  • 查询数据库以获取连接信息,连接到Web服务以进行登录,生成会话ID并更新数据库。
  • 操作调用注销,需要清理数据库,清除会话ID并注销Web服务

我想弄清楚

我想确保在请求注销时我想确保整个过程全部成功,或者根本不成功。例如,我不希望清理数据库,清理会话ID并注销操作失败(因此登录仍然有效)。

理想情况下,解决方案会在故障时“回滚”,从而确保维持先前的状态。

是否有一种灵活的方法来实现这一目标,还是我坚持使用一系列嵌套的try / catch / finally块来实现这一目标?

3 个答案:

答案 0 :(得分:1)

如果要实现某种rollback方法,则必须存储撤消数据,以便在发生故障时回滚所需的所有内容。

  • 对于DB,您已经有了回滚方法。
  • 对于您可能需要回滚的操作中正在修改/删除的每个文件,您必须保留备份副本,以允许您恢复到以前的状态。
  • 任何可能必须回滚的内存中变量应该有备份副本。

这将允许您在代码中的任何位置在发生错误时回滚到先前的状态。

答案 1 :(得分:0)

“整洁”可能意味着这样的事情? (http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

但是我更喜欢你提到的KISS结构......至少在实现复杂的语言/资源构造之前一直坚持工作......让它工作......然后让它更漂亮/更快/解耦/ ..

答案 2 :(得分:0)

对于这个问题的任何偶然的瞥视,假设try / catch块是继承原子的。他们

代码证明:

public class TransactionTest {

    private class Thing {
        public int number = 1;
        public String thingName = "Marge";

    }

    public static void main(String args[]) {
        new TransactionTest();
    }

    public TransactionTest() {
        transactionExperiment();
    }

    private void transactionExperiment() {

        Thing t = new Thing();
        try {
            System.out.println("Original name: " + t.thingName);
            t.thingName = "Homer";
            throw new IllegalArgumentException("Throw exception deliberately");
        }
        catch(IllegalArgumentException e) {
            System.out.println("Caught exception");
        }

        System.out.println("Thing is: " + t.thingName);
    }
}

<强>输出:

  • 原名:Marge
  • 抓住异常
  • 事情是:荷马