我参考URL中所述的示例,即在服务层中的所有方法中应用spring aop事务,但这也将对SELECT等只读方法应用事务管理。
如果我对readOnly事务应用事务管理会有什么不利影响吗?
<aop:config>
<aop:advisor pointcut="execution(* com.xyz.someapp.service.*.*(..)))"
advice-ref="transactionAdvice" />
</aop:config>
http://www.studytrails.com/frameworks/spring/spring-declarative-transactions.jsp
我有另一个问题。如果我有orderService.create()调用了billingService.create(),那么如何应用事务隔离?
答案 0 :(得分:1)
我不认为会有任何不利影响,因为事务只是定义了一组原子操作。如果事务失败,则将执行回滚,但只读操作不会以任何方式影响数据库。 我能想到的唯一的缺点是与性能有关。底层数据库的锁定策略(表或行是否已锁定)决定了您的隔离级别。根据您的锁定策略,在交易期间会应用某种隔离。例如,当您写入数据库时,隔离级别决定并行读取是否可以看到正在进行的更改(导致例如脏读,不可重复读取等),或者是否必须在它们之前提交这些更改让别人知道。 因此,您将锁定您只想读取的资源,这可能会对高可用性应用程序造成性能过高。总结:除了导致性能问题之外,它没有任何不良影响。
解决第二个问题:这取决于您管理交易的方式。我想在这种情况下两种服务方法都需要事务,所以我认为默认行为是第一个服务调用的事务由第二个服务方法调用继承(这称为“事务传播”)。这是必需的,因为不允许嵌套事务。
答案 1 :(得分:1)
您通常希望使用事务甚至是只读操作,因为事务将为您提供一致的数据视图。如果您跳过事务,则可能会从其他一些未完成的事务中看到部分更新。