Ответ 1
Вы можете использовать аннотации, чтобы выполнить более мелкомасштабную демаркацию транзакций. По умолчанию услуги являются транзакционными, а все общедоступные методы являются транзакционными. Но если вы используете аннотации @Transactional
, Grails не делает все транзакционным - у вас есть полный контроль.
Исключения времени выполнения автоматически вызывают откат, но проверенных исключений нет. Несмотря на то, что Groovy не требует, чтобы вы улавливали отмеченные исключения, эта функция является Spring, которая не знает об обработке исключений Groovy.
Транзакции реализуются путем упаковки вашего экземпляра класса службы в прокси. Если исключение "ускользает" от прокси-сервера, будет ли оно пойманным или нет, откат будет уже выполнен.
Итак, у вас есть несколько вариантов. Аннотировать updateSomething
как @Transactional
, но не аннотировать cleanUpOldFile
:
import org.springframework.transaction.annotation.Transactional
@Transactional
def updateSomething(domainObj) {
...
}
def cleanUpOldFile(...) {
...
}
Вы также можете аннотировать cleanUpOldFile одним или несколькими непроверенными исключениями, которые не должны откатывать транзакцию (или в других случаях, проверенных исключениях, которые должны), например
@Transactional(noRollbackFor=[FooException, BarException])
def cleanUpOldFile(...) {
...
}