gpt4 book ai didi

jakarta-ee - Java EE 容器如何控制事务?

转载 作者:行者123 更新时间:2023-12-03 23:29:45 25 4
gpt4 key购买 nike

我有一个关于 EE 容器如何控制事务的问题。这是为我的问题提供一些上下文的伪代码。这不是我编码的方式,所以请留在问题上,不要将主题演变成其他内容。

考虑以下两个服务和相关 Controller 。这两个服务都注入(inject)了 EntityManager 并且都有需要在事务中运行的方法。一项服务有一种不需要任何事务支持的方法。

@Stateless
class UserService {
@PersistenceContext private EntityManager em;

public void saveUser(User user) {
em.merge(user);
}

public String getFullName(User user) {
return user.getFirstName() + " " + user.getLastName();
}
}

@Stateless
class LogService {
@PersistenceContext private EntityManager em;

public void logEvent(String eventText) {
Event event=new Event();
event.setText(eventText);
event.setTime(new Date());
em.persist(event);
}
}


@Named
class UserController {
User user;

@Inject UserService userService;
@Inject LogService logService;

public void updateUser(user) { // button posts to this method
String fullName=userService.getFullName(user); // 1
if(fullName.startsWith("X")) return; // 2
userService.saveUser(user); // 3
logService.logEvent("Saved user " + fullName); // 4
}
}

现在,假设有一个将表单发布到 userController.updateUser 的按钮。

我的假设是 UserController.updateUser()将执行 userService.saveUser(user);logService.logEvent("Saved user " + fullName);在同一笔交易中。所以如果调用 logService.logEvent()失败并出现 SQL 异常,用户实体将不会更新。另外,我的假设是调用 userService.getFullName(user)不在任何事务中运行,如果我们在用户名以 X 开头时提前退出该方法,则不会创建事务。但显然,这些只是猜测。

谁能解释一下 Java EE 容器将做什么来支持 UserController.updateUser()带有事务的方法以及实际触发事务的原因是什么?此外,您可以指出我的任何进一步阅读,将不胜感激。我在网上看到了一些 Material ,但我仍然在这里遗漏了一些东西,并且在工作中也没有得到任何帮助。所以我当然不是唯一在这方面存在差距的人。

最佳答案

在您的情况下,将启动 3 个独立事务。每个由您的 @Stateless 中的一个 bean 类方法。这是因为 session EJB 具有事务类型为 TransactionAttribute.REQUIRED 的事务方法。默认情况下。这意味着如果一个事务尚未运行,新的事务将在方法调用之前创建。

要在一个事务中运行所有 session EJB 方法,您必须将它们包装在一个事务中。在您的情况下,您可以通过注释 updateUser(...) 来做到这一点。使用 @Transactional 的方法

关于jakarta-ee - Java EE 容器如何控制事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com