Java 我应该在服务类上使用@Transactional吗

Java 我应该在服务类上使用@Transactional吗,java,spring,transactions,spring-jdbc,spring-transactions,Java,Spring,Transactions,Spring Jdbc,Spring Transactions,我有一个web应用程序,它使用SpringNamedJDBCTemplate,对数据库的所有调用都是select语句 在这种情况下,我应该在我的服务类中使用@Transactional,该服务类调用inturn向DB激发select语句的DAO类 根据清单10,建议不要使用@Transactional进行读取。使用@Transactional会带来开销吗?我也不想错过AOP的建议,我可以在将来为@Transactional带来开销。是的,您应该始终从事务内部访问数据库。不这样做实际上会为每个se

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

在这种情况下,我应该在我的服务类中使用
@Transactional
,该服务类调用inturn向DB激发select语句的DAO类


根据清单10,建议不要使用
@Transactional
进行读取。使用
@Transactional
会带来开销吗?我也不想错过AOP的建议,我可以在将来为
@Transactional
带来开销。

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


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

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


例如,假设在第一个服务中调用两个服务所需的一个服务将插入或更新某些数据,而另一个服务只是返回这些数据的选择,如果这两个服务不参与单个事务,则第二个服务将不会返回数据,因为调用服务中的事务启动尚未提交.

Vishnu:据我所知,select语句在db级别上不是事务性的,您不需要在服务层中添加@transactional注释。感谢您的回答,我只想比较一下依赖默认事务管理的利弊与“@transactional”之间的优劣。我是不是因为引入了“@Transactional”而背负了不必要的负担。不是。使用事务不应使代码变得更慢。