首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >典型的EJB3 3/JPA/JSF中的事务范围是什么?

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

Stack Overflow用户
提问于 2011-12-23 15:36:19
回答 1查看 1.7K关注 0票数 5

假设您有一个带有EJB3 3/JPA和JSF堆栈的web应用程序。AFAIK您可以使用不同的托管bean来设计屏幕,例如,让我们假设一个HeaderBean和一个ListingBean。由于EJB3 AFAIK中没有OSIF模式,在以下伪代码中执行了多少个不同的事务:

代码语言:javascript
复制
@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期望值,对吧?)

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

我更喜欢较长的事务,但更正数据,而不是短事务,但不正确的数据。我想知道,像jBoss Seam这样的新框架是在某种程度上促进了这一点,还是提供了另一种设计(例如:开放会话视图模式)。

EN

回答 1

Stack Overflow用户

发布于 2011-12-23 16:05:39

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

在您的代码中,在进入EJB时不存在事务,因此正如您从EJB返回时所说的那样,任何事务都已被解析。

虽然这似乎有潜在的问题,因为您可能会得到不一致的数据视图,但我认为这种行为是可取的。我们希望在事务中花费的时间短--否则数据库锁会被保存很长时间,因此并发性会受到影响。

EJB层应该被视为提供原子服务,并相应地设计和使用。我不知道我是否正确地阅读了您的代码,但是对头和主体有单独的访问方法可能不是最好的设计。如果您需要头和体之间的一致性,那么在一个调用中获取所有数据可能更好,而且实际上在单个DB交互中更有效。

-你确实关心屏幕不同部分之间的一致性,如果使用简单的JSF技术进行编码,就会使用单独的事务。

在我看来,当这种不一致非常不可能或不可避免时,默认的JSF方法是合适的。例子: 1)。不可能:查询历史数据、昨天的交易总数和昨天交易的清单。在一个历史无法改变的系统中,这种单独的查询将是一致的。2)。不可避免:总结来自一个系统,细节来自不同的系统,两个系统之间没有事务协调,不能保证一致性。我们只需向用户说明,这两个视图可能有点不协调。

如果您真正想要一致性,请使用不同的方法,将所有数据保存在单个请求中(例如在会话或请求中),然后在两个视图中使用它--如果您关心这些事情,视图不应该获取自己的数据。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8617795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档