Java 在拦截器中开始并提交事务

Java 在拦截器中开始并提交事务,java,hibernate,struts2,transactions,interceptor,Java,Hibernate,Struts2,Transactions,Interceptor,使用拦截器管理事务是否是一种良好的做法? 我有一个优点,虽然它相当于开始和承诺的行动本身。 我为什么要使用拦截器管理的事务 这是一种不错的做法,例如,Spring框架使用@Transactional注释为“自动开始”和“自动提交”事务使用方面 Why should I use interceptor managed transactions at all? 它减少了很多样板代码:打开连接、开始事务、提交事务和关闭连接 但是,如果您想使用拦截器编写自己的事务管理器,请注意并发性问题 根据您发布的

使用拦截器管理事务是否是一种良好的做法? 我有一个优点,虽然它相当于开始和承诺的行动本身。 我为什么要使用拦截器管理的事务


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

Why should I use interceptor managed transactions at all?
它减少了很多样板代码:打开连接、开始事务、提交事务和关闭连接

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

根据您发布的图片:

最好不要从服务层公开事务管理。如果您的表示层对事务管理一无所知,那就更好了。所以,尝试将事务管理代码封装在服务层或DAO层中。如果您的表示层管理事务,而服务层不管理事务,则意味着您的服务不是自包含的,并且只有当客户端提供一些事务管理逻辑时,其他客户端才能重用这些服务

从评论中:

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


你在哪里看到这样的拦截器?嗨,Roman,我的一个朋友建议他以同样的方式使用它,但我发现它没有任何意义,因为它可以锁定数据库单元格,直到从操作返回结果。你有一个例子吗?您能说明它是如何锁定数据库的吗?请参阅interceptor中出现的transaction begin和commit,以便在整个处理完成之前不会修改操作过程中读取的值。事实上,修改必须等待其他操作完成,然后才能实际反映到数据库中。现在请考虑逻辑工作单元(事务)需要更长的时间来完成。在此期间,如果其他事务已读取相同的数据并尝试在前一个事务之前对其进行修改,则前一个事务将回滚。在并发执行环境中,这可能会导致多个事务回滚。发生了什么错误,或者您如何知道事务回滚了?谢谢您的回复。但是您将如何对此进行反击,以锁定数据库单元格,直到从操作返回结果。@amit_yo请参阅更新的答案。数据库锁呢?为什么在执行操作时需要从DB行中移除锁?锁定可防止多个用户尝试读取数据时数据被破坏或失效,而其他用户则写入数据库等。如果您只想将数据库行锁定到执行数据库操作所需的时间,则只在DAO层上使用事务(但通常最好将事务管理委托给服务层),谢谢。关于锁定数据库,请阅读我对我的问题的评论。请说明在服务层或DAO层管理事务的更好方法是哪一种,以及为什么?如果你能提供一些参考或链接,这将是很有帮助的。再次感谢<代码>如果某个其他事务读取了相同的数据并试图在前一个事务之前对其进行修改,则前一个事务将回滚-您为什么决定这样做?你使用什么API?这并不完全正确,它完全是特定于框架/API的。2.更好的方法是将事务管理代码放到服务层,因为服务层通常执行一些业务级别的操作,这些操作必须在一个事务中执行。因此,您的服务方法可以使用2个或更多DAO在一个事务中执行所有DB操作。很抱歉,没有链接-我告诉它你从我的经验。+1。还可以使用Hibernate作为JPA2实现,而不是原始的Hibernate,并且根本不关心事务,它们对于您需要的大多数事情都是自动的(当然,在您正确设置所有事务之后,从JavaEE6开始)。