我在 stack-overflow 文章中看到了很多评论我发现了一些关于@Transactional与@Service或@Controller一起使用的事情
“通常情况下,应该在服务层进行交易。”
“正常情况是在服务层级别进行注释”
“认为事务属于服务层。它了解工作单元和用例。如果您将多个 DAO 注入需要在单个事务中协同工作的服务中,这是正确的答案。” [资源]
将@transactional 与@service 层一起使用的缺点
如果我有 2 种方法,例如 saveUser() 和 saveEmail() (因为我将电子邮件存储在数据库中以便稍后发送它们 - 就像一个队列)我会在我的服务中创建一个方法 saveUserAndSendEmail(User user) 这将是事务性的。[资源]
这意味着我在服务层创建了许多方法,而不是一个保存通用方法,如下所示
public <T> long save(T entity) throws DataAccessException {
Session session = sessionFactory.getCurrentSession();
long getGenVal=(Long) session.save(entity);
return getGenVal;
}
根据上述解决方案,这意味着我们有很多方法,如以下LOL..
public <T> long saveAccount(T entity)....
public <T> long saveWithAuditLog(T entity, K entity1)....
public <T> long saveWithAuditLogAndEntries(T entity, K entity, M entity)....
克服这种情况
我在@Controller 中使用@Transactional 并创建一个通用保存方法并使用这个简单的保存方法保存所有实体/模型。如果任何方法无法保存,则控制器中的所有事务都将成功回滚。
确保@Transactional 应与@Controller 一起使用的其他情况
在@Controller 中:
pt.save(entity1);
pt.save(entity2);
int a = 2/0;
pt.save(entity3);
万一,@Transactional on Service,前 2 个实体成功保存,但第三个不是它不回滚所有事务
万一,@Controller 上的@Transactional 发生异常时所有事务回滚
为什么 stack-overflow 会问,“不要在你的控制器中做事务。把它们放在你的服务层类中。”? [资源]