现在的位置: 首页 > 综合 > 正文

Spring的分布式事务,使用或不用XA – 1

2013年09月21日 ⁄ 综合 ⁄ 共 1168字 ⁄ 字号 评论关闭

原文链接:

http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=1

在Spring中常常使用JTA以及XA协议来实现分布式事务,不过我们也有其他选项。最佳实现取决于你的应用场景,比如使用什么类型的资源,如何在性能、安全、可靠性和数据完整性之间权衡。在这个系列文章中,来自SpringSource的David Syer将详细讲解Spring应用程序可以使用的7种分布式事务模式,其中3种使用XA,4种不使用XA。

级别: 中级

Spring框架对JTA(Java事务应用接口即Java Transaction API)的支持,使得应用程序可以在没有运行J2EE容器的情况下使用分布式事务和XA协议。然而即便如此,XA对于管理员来说仍然是昂贵并且可能会是不可靠或者笨重的。它可能会带来初次体验的惊喜,但最终不少类型的应用都会避免使用它。

为了帮助你理解实现分布式事务的各种方法,我将分析7种分布式事务处理模式,提供具体的示范代码,我将按照安全性和可靠性由高到低的方式来逐个表述,从那些在最常用情况下能最大程度保证数据完整性和原子性的方法开始。当你依次往下阅读时,注意事项和使用限制会逐渐增多。另外这些模式基本上也是按照运行成本倒叙安排(从成本最高的开始)。这些模式都是架构或者技术模式,而不是业务模式, 所以我不会关注于具体业务,而只是提供说明各个模式如何工作的简短代码。

注意只有开始的3个模式使用了XA,而这些由于性能原因可能并不合适或不可接受。我并不会扩展讨论XA模式,因为XA已经在其他文章中被充分讨论,尽管我在第一个模式中提供了简单的示范代码。通过阅读这篇文章,你将学习到你能通过分布式事务做到什么,不能做什么以及何时如何避免使用XA - 以及什么情况下应该用XA。

分布式事务和原子性

分布式事务(distributed transaction) 指的是包含多个事务资源的事务。事务资源指的是比如和关系型数据库和消息中间件通讯的连接器。通常这样的资源提供一些API比如begin(), rollback(), commit(). 在Java编程中, 事务资源通常显露为一个由底层平台提供的工厂产品:对于数据库而言,它是一个由DataSource产生的连接,或者Java Persistence API (JPA) EntityManager;对于Java Message Service (JMS)而言,它是一个会话(Session).

典型的一个用例, JMS消息触发一个数据库更新。一个成功的交互序列如下所示:

  1. 开始一个消息事务
  2. 获取消息
  3. 开始数据库事务
  4. 更新数据库
  5. 提交数据库事务
  6. 提交消息事务

如果一个数据库错误比如在更新时遇到约束冲突,理想的交互序列看起来如下:

by iefreer

抱歉!评论已关闭.