【发布时间】:2011-12-23 15:36:19
【问题描述】:
假设您有一个带有 EJB3/JPA 和 JSF 堆栈的 Web 应用程序。 AFAIK 您可以使用不同的托管 bean 来设计您的屏幕,例如,假设一个 HeaderBean 和一个 ListingBean。由于 EJB3 AFAIK 中没有 OSIF 模式,因此在以下伪代码中执行了多少不同的事务:
@ManagedBean
class HeaderBean {
@PreConstruct
load(){
// enters transaction boundary, probably will create a new tx
headerInfo = ejb.loadFromDb();
}
}
@ManagedBean
class ListingBean{
@PreConstruct()
list(){
// enters transaction boundary, probably will NOT join the headerBean tx
List<Data> listing = eao.loadFromDb(0, 20);
}
}
当您离开 EJB 层时,所有事务都已提交;因此,如果我从表示层调用两个不同的 SLSB,它将在两个不同的事务中运行(并且可能会打破我的 ACID 期望,对吧?)。
澄清:我知道 EJB3 事务行为,例如 required, never, requires_new 等。我的问题更多是关于View-First(例如 JSF)如何促进这种设计,其中屏幕数据可能跨越多个事务,因此可能不准确。
我更喜欢较长的交易但数据正确,而不是较短的交易但数据不正确。我想知道诸如 jBoss Seam 之类的新框架是否会以某种方式促进这一点或提供替代设计(例如:Open-Session-In-View 模式)。
【问题讨论】:
-
CMT 仅在 EJB 上可用。
loadFromDb方法的名字看起来甚至不需要事务。
标签: java jsf architecture transactions ejb-3.0