【发布时间】:2013-12-21 17:42:01
【问题描述】:
我有一个关于 EE 容器如何控制事务的问题。这是为我的问题提供一些上下文的伪代码。这不是我编码的方式,所以请留在问题上,不要将主题演变为其他内容。
考虑以下两个服务和相关的控制器。这两个服务都注入了 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() 方法与事务以及实际触发事务的原因是什么?此外,您可以指出我的任何进一步阅读,将不胜感激。我在网上看到了一些材料,但我仍然在这里遗漏了一些东西,并且在工作中也没有得到任何帮助。所以我当然不是唯一在这方面存在差距的人。
【问题讨论】:
标签: jakarta-ee transactions entitymanager