sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-03 23:29:45 27 4
mua khóa gpt4 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 ,但我仍然在这里遗漏了一些东西,并且在工作中也没有得到任何帮助。所以我当然不是唯一在这方面存在差距的人。

1 Câu trả lời

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

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

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

27 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com