Mein Grails-Dienst hat ein Problem, bei dem eine verschluckte Ausnahme, die nicht mit einer Transaktion zusammenhängt, das Rollback der Transaktion verursacht, auch wenn sie nicht mit der Persistenz des Domänenobjekts zusammenhängt.Wie verhindere ich, dass Ausnahmen unter Grails einen Transaktions-Rollback verursachen?
In meinem Dienst Ich habe etwas entlang der Linien von
updateSomething(domainObj) {
def oldFilename = domainObj.filename
def newFilename = getNewFilename()
domainObj.filename = newFilename
domainObj.save(flush: true)
try {
cleanUpOldFile(oldFilename)
} catch (cleanupException) {
// oh well, log and swallow
}
}
Was ich sehe, ist, dass, wenn ich Ausnahme, wenn ich die alte Datei am Aufräumen, ich es einzuloggen und schlucken, aber es immer noch bewirkt, dass die Transaktion zurückgesetzt wird, obwohl das Domänenobjekt bereits aktualisiert wurde.
Wie kann ich begrenzen, dass die Scope-Transaktion vor der Bereinigung abgeschlossen wird, oder gibt es eine andere Möglichkeit, die Cleanup-Ausnahme zu erhalten, die kein Rollback verursacht?
Gerade für die Aufzeichnung verwende ich Grails 2.1.1
Eine Sache, die ich nicht vollständig verstehe, sollte mein catch-Block nicht alle Ausnahmen erfassen, sowohl Laufzeit als auch überprüft? Woher weiß Spring überhaupt, dass ich Ausnahmen habe? –
Ich nehme an, dass es die Ausnahme zwischen den Service-Ebenen bemerkt, in meinem Fall hatte ich eine Service-Schicht, die mit einer anderen sprach. Das ist das einzige, was für mich einen Sinn ergibt. –
Wenn Sie nur @Transactional (noRollbackFor = [FooException, BarException]) zu cleanUpOldFile() hinzufügen, welchen Effekt hat das für jede andere Methode in der Klasse? Sind sie noch transaktional oder nicht? –