繁体   English   中英

典型的EJB3 / JPA / JSF中的事务范围是什么?

[英]What is the transaction scope in a typical EJB3/JPA/JSF?

假设您有一个带有EJB3 / JPA和JSF堆栈的Web应用程序。 可以使用不同的托管bean设计屏幕,例如,假设HeaderBeanListingBean 由于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);
  }
}

AFAIK当您离开EJB层时,所有事务都被提交; 因此,如果我从表示层调用两个不同的SLSB ,它将在两个不同的事务中运行(并且可能违反我对ACID的期望吧?)。


澄清 :我知道EJB3事务行为,例如required, never, requires_new等。 我的问题更多是关于View-First (例如JSF)如何促进这种设计的,其中屏幕数据可能跨越多个事务,因此可能不准确。

与短交易但数据不正确相比,我更喜欢较长的交易但数据正确。 我想知道是否像jBoss Seam这样的新框架以某种方式促进了这一点或提供了替代设计(例如:Open-Session-In-View模式)。

有一些选项可以控制EJB的事务行为。 通常,它们具有“需要事务”设置,因此,如果调用了Bean且事务已就位,则该Bean的工作将包含在已建立的事务中,否则当Bean返回时将启动并完成一个事务。

在您的代码中,进入EJB时没有任何事务,因此正如您所说的,从EJB返回时,任何事务都已解决。

尽管这看起来可能会带来问题,因为您可能会获得不一致的数据视图,但我认为这种行为是可取的。 我们希望在事务中花费的时间要短-否则数据库锁将保留很长时间,因此并发会受到影响。

EJB层应被视为提供原子服务,并据此进行设计和使用。 我不知道我是否在正确阅读您的代码,但是对于Header和Body具有单独的访问方法可能不是最佳设计。 如果您需要标头和正文之间的一致性,则最好在一个调用中提取所有数据,并且实际上可以在单个DB交互中更有效地完成。

-添加-在您的问题中您已经澄清说,您确实担心屏幕的不同部分之间的一致性,如果使用简单的JSF技术进行编码,则会使用单独的事务。

在我看来,当这种不一致可能性极小或无法避免时,默认的JSF方法是适当的。 例子:1)。 不太可能:查询历史数据,昨天的交易总数和昨天的交易清单。 在历史记录无法更改的系统中,此类单独的查询将保持一致。 2)。 不可避免:摘要来自一个系统,细节来自不同的系统,两个系统之间没有事务协调,我们无法确保一致性。 我们只需要向用户显示两个视图可能略有不同的指示。

在您真正希望保持一致性的地方,使用另一种方法,将所有数据保存在一个请求中并保存(例如在会话或请求中),然后在两个视图中使用它们-如果您关心这些视图,则视图不应获取自己的数据。

我认为您会发现尝试使用事务来保持事物一致的尝试会增加相当大的复杂性并影响吞吐量。 跨视图协调事务的问题在于,没有简单的“所有者”,如果重新组成页面,则需要更改逻辑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM