grails.gorm.transactions.Transactional не откат - PullRequest
0 голосов
/ 08 ноября 2018

У меня возникли проблемы с откатом транзакции в слое обслуживания со следующим:

Граальс 3.3.8

ГОРМ 6.1.10. РЕЛИЗ

У меня есть следующий метод обслуживания:

import grails.gorm.transactions.Transactional

@Transactional(rollbackFor = Exception.class)
class TestingService {

    void testServiceMethod(List<Factory> factories) {
        try {
            factories.each {
                if (it.name == 'second') {
                    throw new Exception('second')
                }
                it.testField = 'Edited'
                it.save()
                println(it.name + ' saved')
            }
        } catch (Exception e) {
            println('Exception Caught ' + e)
        }
    }
}

У меня также есть следующий интеграционный тест:

@Integration
@Rollback
class TestServiceIntSpec extends Specification {

    @Autowired
    TestingService testingService

    def setup() {
    }

    def cleanup() {
    }

    void "test something"() {
        when:
        Factory factoryOne = new Factory(name: "first").save(flush: true)
        Factory factoryTwo = new Factory(name: "second").save(flush: true)
        List<Factory> factories = [factoryOne, factoryTwo]
        testingService.testServiceMethod(factories)

        then:
        factoryOne.testField == null
        factoryTwo.testField == null
    }
}

У меня также есть следующий метод контроллера:

class TestController {

    TestingService testingService

    def index() {
        Factory factoryOne = new Factory(name: "first").save(flush: true)
        Factory factoryTwo = new Factory(name: "second").save(flush: true)
        List<Factory> factories = [factoryOne, factoryTwo]
        testingService.testServiceMethod(factories)
        println "First Factory: $factoryOne.testField"
        println "First Factory: $factoryTwo.testField"
        render 'Check Console'
    }
}

Я бы ожидал, что тест пройдёт, поскольку я думал, что транзакция будет отменена после того, как я сгенерировал новое исключение, однако it.testField сохраняется? Также, когда я пингую TestController, он выводит factoryOne.testField как «отредактированный». Я правильно понял это из документации?

"Службы включают разграничение транзакций, которое является декларативным способом определения того, какие методы должны быть сделаны транзакционными. Чтобы включить транзакции в службе, используйте преобразование транзакций: В результате все методы обернуты в транзакцию, и происходит автоматический откат, если метод генерирует исключение (исключение «Проверено» или «Время выполнения») или Ошибка. "

Источник: https://docs.grails.org/latest/guide/services.html#declarativeTransactions

Я не вижу, что я делаю, отличается от этого другого ответа Stackoverflow:

https://stackoverflow.com/a/25739582/6887293

Проблема может быть воссоздана, если потянуть за следующий проект Github и запустить /factory/factory/src/integration-test/groovy/com/mycompany/myapp/TestServiceIntSpec.groovy или pinging / factory / factory / grails-app / controllers /com/mycompany/myapp/TestController.groovy

https://github.com/georgy3k/IntegrationTestRollBack/tree/8addd2b95a8ffa4570e70eccb3b023b0ccfef5aa

Заранее спасибо ...

1 Ответ

0 голосов
/ 06 декабря 2018

В вашем блоке catch вам нужно повторно выдать исключение.

catch (Exception e) {
        println('Exception Caught ' + e)
        throw e;
}

Проблема, на мой взгляд, состоит в том, что исключение никогда не ускользает от метода.

...