在本系列先前的文章中,我们主要讲解了JDBC对本地事务的处理,本篇文章将讲到一个分布式事务的例子。
请通过以下方式下载github源代码:
本地事务和分布式事务的区别在于:本地事务只用于处理单一数据源事务(比如单个数据库),分布式事务可以处理多种异构的数据源,比如某个业务操作中同时包含了JDBC和JMS或者某个操作需要访问多个不同的数据库。
Java通过JTA完成分布式事务,JTA本身只是一种规范,不同的应用服务器都包含有自己的实现(比如JbossJTA),同时还存在独立于应用服务器的单独JTA实现,比如本篇中要讲到的Atomikos。对于JTA的原理,这里不细讲,读者可以通过这篇文章了解相关知识。
在本篇文章中,我们将实现以下一个应用场景:你在网上购物,下了订单之后,订单数据将保存在系统的数据库中,同时为了安排物流,订单信息将以消息(Message)的方式发送到物流部门以便送货。
以上操作同时设计到数据库操作和JMS消息发送,为了使整个操作成为一个原子操作,我们只能选择分布式事务。我们首先设计一个service层,定义OrderService接口:
packagedavenkin;public interfaceOrderService {public voidmakeOrder(Order order);
}
为了简单起见,我们设计一个非常简单的领域对象Order:
@XmlRootElement(name = "Order")
@XmlAccessorType(XmlAccessType.FIELD)public classOrder {
@XmlElement(name= "Id",required = true)private longid;
@XmlElement(name= "ItemName",required = true)privateString itemName;
@XmlElement(name= "Price",required = true)private doubleprice;
@XmlElement(name= "BuyerName",required = true)privateString buyerName;
&#