【问题标题】:What is the benefit of using @Transactional in Controller layer on spring MVC application在 Spring MVC 应用程序的 Controller 层中使用 @Transactional 有什么好处
【发布时间】:2017-01-07 08:47:10
【问题描述】:

在 Spring 4 MVC 应用程序中,我注意到 @Transactional 注释用于控制器层。但在很多地方建议在服务层(服务实现类)内使用。

@Controller 类中使用@Transactional 有什么好处?

另外,我有一个服务层实现类,它将数据更新到数据库,我注意到事务属性的用法如下

@Transactional(propagation = Propagation.REQUIRED, readOnly = true)

readOnly = true,当方法使用从数据库中查找或获取一些数据时使用。 但是使用 readOnly = true,服务层无论如何都能够保存数据。 我的应用程序使用 Spring 4 + Hibernate 4.2.20。

应用程序使用的事务管理器

<bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager" >
        <property name="sessionFactory" ref="sessionFactory" /> 
    </bean>

在事务中使用“readOnly = true”就能将数据保存到数据库?

【问题讨论】:

  • 您确定数据保存正确吗?如果您使用休眠并将@Transaction 设置为只读,则很可能不会发生写入,因为它禁用了刷新到数据库的语句(FlushMode 设置为 NEVER)。但是你不会有任何错误。
  • 一些 JDBC 驱动忽略只读模式。
  • 是的。最重要的是,只读弹簧事务期间写入的确切行为非常依赖于使用的堆栈,因此您不应该依赖它。有关此问题的更深入了解,请参阅本文ibm.com/developerworks/library/j-ts1
  • 我从来没有遇到过使用它保存数据的问题

标签: java hibernate spring-mvc transactions spring-transactions


【解决方案1】:

没有理由在@Controller 中使用注解@Transactional。

不这样做的原因很简单:最佳实践。 @Controller 不应该知道 MVC 逻辑中的数据持久性,只知道服务层。

此外,Spring 建议不要只注释整个类的某些方法,这也是一种很好的做法,因此您可以轻松地维护您的应用程序。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 2015-01-16
    • 2017-12-12
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多