【问题标题】:Should I ever use @Transactional on a Service class我应该在服务类上使用@Transactional
【发布时间】:2015-04-22 06:19:15
【问题描述】:

我有一个使用 Spring NamedJDBCTemplate 的 Web 应用程序,所有对数据库的调用都是 select 语句。

在这种情况下,我应该在我的服务类中使用@Transactional,它调用 DAO 类,然后触发选择语句到 DB。

根据 Transaction statergies 清单 10 建议不要使用 @Transactional 进行读取。我是否会通过使用@Transactional 带来开销,而且我不想错过 AOP 的建议,我可以在将来为@Transactional 带来。

【问题讨论】:

  • Vishnu:据我所知,select 语句在数据库级别不是事务性的,您不需要在服务层中使用 @Transactional 注释。

标签: java spring transactions spring-jdbc spring-transactions


【解决方案1】:

是的,您应该始终从事务内部访问数据库。不这样做实际上会为每个 select 语句创建一个事务。

事务不仅对更新的原子性有用。它们还提供隔离保证。例如,(取决于隔离级别)在单个事务中读取同一行两次可以返回相同的数据,从而确保读取的数据没有不一致。对多笔交易执行此操作不会提供任何此类保证。

【讨论】:

  • 感谢您的回答,我只是想比较一下依赖默认事务管理与“@Transactional”的优缺点。我是否只是通过引入“@Transactional”来承担不必要的负担。
  • 没有。使用事务不应该让你的代码变慢。
【解决方案2】:

我认为最好的方法是使用 @Transactional 并将其设置为 Supported not Required 对于此类服务 这样,如果您的服务在事务之外调用,它将不会启动事务,并且如果它从其他事务性服务调用并且已经启动事务,它将参与该事务。

例如,认为一个服务需要在第一个服务中调用两个服务,一些数据将插入或更新,另一个只是一个选择,如果这两个服务不参与单个事务,则第二个服务不会返回这些数据返回数据,因为事务开始调用服务尚未提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多