Seam框架中的事务与持久化管理
1. 细粒度状态管理与事务基础
在数据库驱动的Web应用中,事务是至关重要的特性。在每次对话中,通常需要更新多个数据库表。若数据库操作出现错误(如数据库服务器崩溃),应用需通知用户,且该对话写入数据库的所有更新必须回滚,以避免部分更新(即损坏)的记录。也就是说,对话中的所有数据库更新必须在原子操作内完成。
以酒店预订为例,在对话结束时, HotelBookingAction.confirm()
方法使用单个事务将预订对象保存到数据库,并从数据库中扣除酒店房间库存:
public class HotelBookingAction implements HotelBooking, Serializable {
@End
public String confirm() throws InventoryException {
if (booking==null || hotel==null)
return "main";
em.persist(booking);
hotel.reduceInventory();
if (bookingList!=null)
bookingList.refresh();
return "confirmed";
}
// ... ...
}
若出现任何问题,整个事务失败,数据库保持不变,用户将收到错误消息而非确认号码。
2. Seam管理的事务
在EJB3应用中,所有EJ