如何在java中进行涉及jdbc、jms和WebService的分布式事务
在一次采访中,我被问到以下问题,但我无法回答 如何将jdbc操作、web服务调用和JMS操作包含到一个事务中。这意味着,如果其中一个失败,则必须回滚所有如何在java中进行涉及jdbc、jms和WebService的分布式事务,java,transactions,Java,Transactions,在一次采访中,我被问到以下问题,但我无法回答 如何将jdbc操作、web服务调用和JMS操作包含到一个事务中。这意味着,如果其中一个失败,则必须回滚所有 我听说过在涉及多个数据库的数据库事务中使用两阶段提交协议和OraclXA。但不确定是否可以在这里使用相同的方法 关键因素是您连接到的web服务是使用支持事务的web服务框架构建的。JBoss Narayana就是这样一个web服务框架。一旦您连接到的web服务端点位于这样的框架上,就只需配置spring以使用适当的客户端 对于Narayana,
我听说过在涉及多个数据库的数据库事务中使用两阶段提交协议和OraclXA。但不确定是否可以在这里使用相同的方法 关键因素是您连接到的web服务是使用支持事务的web服务框架构建的。JBoss Narayana就是这样一个web服务框架。一旦您连接到的web服务端点位于这样的框架上,就只需配置spring以使用适当的客户端 对于Narayana,使用web服务进行事务的spring配置(从):
这可能是个骗人的问题,正确的答案是“做不到” 但我会尝试编写类似这样的代码:
try{
jdbc.startTransaction();
Savepoint saveJdbc = jdbc.setSavepoint();
JMS.startTransaction();
Savepoint saveJMS = JMS.setSavepoint();
jdbs.doSomeStuff();
JMS.doSomeStuff();
jdbc.commit();
JMS.commit();
if(webServise.doSomeStuff() == fail){throw new Exception();}
}
catch(Eception e){
jdbc.rollback(saveJdbc);
JMS.rollback(saveJMS);
}
你准备了一份已经倒转的服务。你准备了第二份已经倒转的菜。您将尝试web服务,如果web服务失败,您将回滚已回滚的两个
这可能是一种实现对web服务回滚的方法。由于系统是分开的,您永远无法以完全防爆炸的方式实现这一点。系统某个阶段的故障(例如,在SQL提交和JMS提交之间,服务器上的电源关闭)将使SQL提交保持原位 解决这个问题的唯一方法是在某个地方保留一些部分提交的记录,并在启动时扫描这些记录,以修复任何由此产生的问题。但是现在,如果处理或保留该列表失败,会发生什么情况呢 基本上,解决方案是自行实现多阶段提交和回滚过程,该过程包含您需要执行的三个操作。如果任何操作失败,那么您需要反转(最好使用内部事务机制,如果没有,则通过发出反转命令)到目前为止已经完成的任何操作
<> P.>这样的系统会有很多角落的案例和潜在的方法,所以真正的第一种方法应该是考虑你是否可以重新设计系统,这样你就不需要这样做了!p> 我们遇到了同样的情况,比如web服务将推送数据,我们必须读取xml流并持久化到db(oracle)。我们遵循的实现是
在我看来,面试官似乎喜欢了解你们在企业范围内的分布方面的思考能力。几点:
现在最好的方法可能是编写一个JMS订户,它决定在
onMessage()方法中执行什么操作。例如,假设一个web服务是从客户机发起的付款请求。这将启动一个JMS发布器,告诉DAO进行必要的到数据库的内部连接,当事务处于中间时,当事务完成时,一条消息将发布到订阅服务器。您将拥有对每个步骤的完全粒度控制,因为这些步骤将被配置为通过JMS发布。虽然这很难实现,但这可能是面试官期望你采取的方法。(这只是我的猜测,请注意。)JMS系统也可以支持XA。但是网络服务。。。不可能。