以下以机票预订系统为例,阐述Spring和EJB 3.0提供的事务处理功能。

图二. 购票流程序列图。如果中间任一步骤失败,应确保系统状态的一致性。
如下的单元测试验证购票操作流程以事务方式运作:
public void testPurchaseTicket_DebitFailure() throws Exception
...{
// 创建机票对象
Ticket ticket = createTicket();
// 保存数据库中机票数量
int count = ticketDAO.findAll().size();
// 设置信用卡授权
setupMockAuthorizer(true);
try
...{
bookingAgent.purchaseTicket(ticket, true);
fail("System failure was not thrown as was intended");
}
catch (InsufficientFundsException e)
...{
// 纠正异常行为
}
// 验证事务回滚
assertEquals(count, ticketDAO.findAll().size());
}
此测试在Spring 和 EJB 3.0中均能通过。下面是Spring的实例类:
public Ticket purchaseTicket(Ticket ticket)
...{
creditAuthorizer.authorize(ticket.getPrice(), null);
ticket.setStatus(Status.PURCHASED);
ticketDAO.save(ticket);
creditAuthorizer.debit(ticket.getPrice());
return ticket;
}
![]()
以下是EJB 3.0的实例类
![]()
public Ticket purchaseTicket(Ticket ticket)
...{
creditAuthorizer.authorize(ticket.getPrice(), null);
ticket.setStatus(Status.PURCHASED);
ticketDAO.save(ticket);
creditAuthorizer.debit(ticket.getPrice());
return ticket;
}
Spring和 EJB 3.0在处理方式上都不必直接和事务管理细节打交道。这说明了声明式编程的优势。事务管理可以模块化的方式在整个应用范围内重用,以避免业务逻辑混乱,从而使开发人员可将主要精力用在处理业务问题方面。