Spring 服务层的AOP事务管理
Spring AOP transaction management for service layer
我参考了 URL 中所述的示例,该示例将 spring aop 事务应用于服务层中的所有方法,但这也将对只读方法应用事务管理,例如 SELECT。
如果我对只读事务应用事务管理,有什么不利影响吗?
<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(),将如何应用事务隔离?
我认为不会有任何不利影响,因为事务只是定义一组原子操作。如果事务失败,则将执行回滚,但只读操作不会以任何方式影响数据库。
我能想到的唯一大缺点与性能有关。底层数据库的锁定策略(table 或行是否被锁定)决定了您的隔离级别。根据您的锁定策略,在交易期间应用了某种隔离。例如,当您写入数据库时,您的隔离级别决定了正在进行的更改是否可以被并行读取看到(导致例如脏读、非重复 table 读取等),或者这些更改是否具有在他人看到之前承诺。
因此,您会锁定只想读取的资源,这可能会导致高可用性应用程序的性能过高。总结:除了导致性能问题外,它没有不良影响。
解决您的第二个问题:这取决于您管理交易的方式。我猜在这种情况下两种服务方法都需要事务,所以我认为默认行为是第一个服务调用的事务由第二个服务方法调用继承(这称为 'transaction propagation')。这是必需的,因为不允许嵌套事务。
您通常想要使用事务,即使是只读操作,因为事务会给您一致的数据视图。如果您跳过交易,您可能会看到来自其他一些未完成交易的部分更新。
我参考了 URL 中所述的示例,该示例将 spring aop 事务应用于服务层中的所有方法,但这也将对只读方法应用事务管理,例如 SELECT。
如果我对只读事务应用事务管理,有什么不利影响吗?
<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(),将如何应用事务隔离?
我认为不会有任何不利影响,因为事务只是定义一组原子操作。如果事务失败,则将执行回滚,但只读操作不会以任何方式影响数据库。 我能想到的唯一大缺点与性能有关。底层数据库的锁定策略(table 或行是否被锁定)决定了您的隔离级别。根据您的锁定策略,在交易期间应用了某种隔离。例如,当您写入数据库时,您的隔离级别决定了正在进行的更改是否可以被并行读取看到(导致例如脏读、非重复 table 读取等),或者这些更改是否具有在他人看到之前承诺。 因此,您会锁定只想读取的资源,这可能会导致高可用性应用程序的性能过高。总结:除了导致性能问题外,它没有不良影响。
解决您的第二个问题:这取决于您管理交易的方式。我猜在这种情况下两种服务方法都需要事务,所以我认为默认行为是第一个服务调用的事务由第二个服务方法调用继承(这称为 'transaction propagation')。这是必需的,因为不允许嵌套事务。
您通常想要使用事务,即使是只读操作,因为事务会给您一致的数据视图。如果您跳过交易,您可能会看到来自其他一些未完成交易的部分更新。