我应该在服务上使用@Transactional class

Should I ever use @Transactional on a Service class

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

在这种情况下,我应该在我的服务 class 中使用 @Transactional 来调用 DAO class 进而向 DB 触发 select 语句。

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

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

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

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

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