当前位置: 首页 > 知识库问答 >
问题:

如何禁用方法的事务性

夹谷腾
2023-03-14

我有一个向/从外部系统转移资金的服务方法。

    null

我不知道如何注释这些,也不知道如何构造第4个请求来管理第3个请求。

共有1个答案

荆树
2023-03-14

我会这样做:

package com.myapp

import grails.transaction.Transactional

import org.springframework.transaction.annotation.Propagation

@Transactional
class MyService {

    def createPaymentTransaction() {}

    def sendToPaymentSystem() {}

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    def createPaymentRecord() {}

    def method4() {
        try {
            def transactionId = createPaymentTransaction()
            sendToPaymentSystem(transactionId)
        }
        finally {
            createPaymentRecord()
        }
    }
}

通过在类级别进行注释,我们设置了所有方法的默认值,但是可以根据需要进行自定义,例如CreatePaymentMethod

因此,调用method4将加入一个现有事务,或者在必要时启动一个新事务。如果CreatePaymentTransactionSendTopaymentSystem中出现问题,则事务将回滚,但对CreatePaymentRecord的调用将发生,因为它位于Finally块中,并且它将在单独的事务中运行,因此不会受到主事务中回滚的影响,并且在主事务中出现故障也不会影响主事务。

def grailsApplication

然后通过以下方式调用CreatePaymentRecord

grailsApplication.mainContext.myService.createPaymentRecord()

finally块中。

 类似资料:
  • 我试图做一些测试,看看我的事务方法是否工作正常。然而,我不完全理解我是否应该嘲笑数据库,以及JOOQ是如何进入这个等式的。下面是Service类,其中包含向数据库添加角色的事务。 我使用MySQL和连接到数据库是使用Spring配置文件 我假设不必每次测试事务并在完成后关闭连接时都重新连接到数据库。我知道有 但我不明白它是怎么工作的。 测试上述方法的最佳方法是什么?

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。

  • 我需要在事务成功或回滚后调用一些方法。我使用as 应用程序使用一些外部web服务,当内部事务回滚时,这些服务需要“清理”。有没有一种方法可以在不使用声明性事务管理的情况下实现这一点。

  • 我想在我的应用程序开始时读取文本数据夹具(CSV文件),并将其放入数据库。 为此,我创建了一个带有初始化方法的PopulationService(@PostConstruct注释)。 我还希望它们在单个事务中执行,因此我在同一个方法上添加了@Transactional。 然而,@Transactional似乎被忽略了:事务在我的低级DAO方法中启动/停止。 那么我需要手动管理交易吗?

  • 我有一个database.xml来定义spring事务,比如 和我的dao,服务都在utils包或子包中,比如: 提前感谢您的帮助和建议!

  • 我正在从非事务类try块(由另一个EJB类调用)调用事务方法a,该块将引发RuntimeException 然后在catch块中,事务方法b将处理exp。 令人惊讶的是,我必须用“REQUIRES\u NEW”注释方法B,否则程序将出现“Transaction is not active”异常。(stacktrace与此类似) 这是否是因为方法A的事务(标记为RuntimeException的回滚