Java 如何使一系列非数据库方法模拟事务。
我需要执行几个方法调用,这些调用需要是“事务性的”,但除了try/catch/finally之外,我不确定如何实现 背景Java 如何使一系列非数据库方法模拟事务。,java,transactions,Java,Transactions,我需要执行几个方法调用,这些调用需要是“事务性的”,但除了try/catch/finally之外,我不确定如何实现 背景 应用程序是基于控制台的 应用程序将有多个线程 查询数据库以获取连接信息,连接到Web服务进行登录,生成会话ID并更新数据库 操作调用注销,注销需要清理数据库、清除会话ID并注销Web服务 我想弄明白什么 我想确保当要求注销时,我想确保整个过程要么全部成功,要么根本没有成功。例如,我不希望数据库被清理,会话ID被清理,注销操作失败(因此登录仍然有效) 理想情况下,解决方案将
- 应用程序是基于控制台的李>
- 应用程序将有多个线程
- 查询数据库以获取连接信息,连接到Web服务进行登录,生成会话ID并更新数据库
- 操作调用注销,注销需要清理数据库、清除会话ID并注销Web服务
是否有一种巧妙的方法来实现这一点,或者我是否需要一系列嵌套的try/catch/finally块来实现这一点 如果要实现某个
回滚
方法,则必须为发生故障时需要回滚的所有内容存储撤消数据
- 对于DB,您已经有了回滚方法
- 对于您在操作中修改/删除的每个可能需要回滚的文件,您必须保留一个备份副本,以便恢复到以前的状态
- 任何可能必须回滚的内存中变量都应该有备份副本
但是我更喜欢你提到的KISS结构…至少在使用复杂的语言/资源结构实现之前,要先稳定地工作…让它工作起来…然后让它变得更漂亮/快速/解耦/…对于这个问题的任何漫不经心的人来说,不要假设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);
}
}
输出:
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);
}
}
- 原名:玛姬
- 抓住例外
- 事情是:荷马