【问题标题】:Begin and commit transaction in interceptor在拦截器中开始并提交事务
【发布时间】:2013-11-29 19:33:57
【问题描述】:

使用拦截器来管理事务是一种好习惯吗? 我有一个强项,尽管它等同于在动作本身中开始和提交。 为什么我应该使用拦截器管理的事务?

【问题讨论】:

  • 你在哪里看到这样的拦截器?
  • 嗨 Roman,我的一个朋友建议他以同样的方式使用它,但我发现它没有任何意义,因为这会锁定数据库单元格,直到从操作返回结果。
  • 你有例子吗?你能说明它是如何锁定数据库的吗?
  • 看到transaction begin和commit出现在interceptor中,所以操作过程中读取的值在整个处理完成之前不会被修改。实际上修改必须等待其他操作完成才能真正生效反映到 db。现在想想逻辑工作单元(事务)需要更长的时间才能完成。在此期间,如果其他一些事务已读取相同的数据并尝试在前一个事务之前修改它,那么前一个事务将被回滚.在并发执行环境中,这可能导致多个事务回滚。
  • 发出了什么错误或者你怎么知道事务被回滚了?

标签: java hibernate struts2 transactions interceptor


【解决方案1】:

这是不错的做法,例如 Spring 框架使用 @Transactional 注释的“自动开始”和“自动提交”事务的方面。

Why should I use interceptor managed transactions at all?

它减少了很多样板代码:打开连接、开始事务、提交事务和关闭连接。

但如果您想使用拦截器编写自己的事务管理器 - 请注意并发问题

根据您发布的图片:

最好不要从服务层暴露事务管理。如果您的表示层对事务管理一无所知,那就更好了。所以尽量把你的事务管理代码封装在服务层或者DAO层。如果你的表现层管理事务而服务层没有,这意味着你的服务不是自包含的,只有在客户端提供一些事务管理逻辑的情况下,它们才能被其他客户端重用。

来自评论:

更好的是把事务管理代码放到服务层,因为 服务层通常执行一些业务级别的操作,其中 必须在一个事务中执行。所以你的服务方法可以 使用 2 个或更多 DAO 在一个事务中执行所有 DB 操作。 抱歉,没有链接 - 我是根据我的经验告诉你的。

【讨论】:

  • 感谢您的回复。但是您将如何反击这会锁定数据库单元格,直到从操作返回结果为止。
  • @amit_yo 查看更新的答案。数据库锁呢?为什么在执行操作时需要从数据库行中删除锁?当多个用户尝试读取而其他用户写入数据库等时,锁定可防止数据被损坏或失效。如果您只想将 DB 行锁定到执行 DB 操作所需的时间 - 然后仅在 DAO 层上使用事务(但通常它是最好将事务管理委托给服务层)
  • 谢谢。关于锁定数据库,请阅读我对我的问题的评论。请告诉在服务层或 DAO 层管理事务哪一种更好,为什么?如果您可以提供一些参考或链接,将会很有帮助。再次感谢。
  • 1. if some other transaction has read the same data & tries to modify it before previous one then the previous one will be roll-backed - 你为什么这样决定?你使用什么API?这并不完全正确,它完全是特定于框架/API 的。 2. 更好的是把事务管理代码放到服务层,因为服务层通常会执行一些业务级别的操作,这些操作必须在一个事务中执行。因此,您的服务方法可以使用 2 个或更多 DAO 在一个事务中执行所有 DB 操作。抱歉,没有链接 - 我是根据我的经验告诉你的。
  • +1。还使用 Hibernate 作为 JPA 2 实现而不是原始休眠,并且根本不关心事务,它们对于您需要的大多数事情都是自动的(在您正确设置所有内容之后,当然从 Java EE 6 开始)。
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多