Sí, eso lo hará.
Las transacciones en Grails se manejan de forma predeterminada en un nivel de método de servicio. Si el método retorna normalmente, se comprometerá la transacción; si se lanza una RuntimeException, la transacción se retrotraerá.
Tenga en cuenta que incluso si usa flush: true mientras se guarda un objeto en el método del servidor, los cambios de db se revertirán si lanza una RuntimeException.
Por ejemplo:
class MyService {
def fiddle(id,id2){
def domain = Domain.findById(id)
domain.stuff = "A change"
domain.save(flush:true) // will cause hibernate to perform the update statements
def otherDomain = OtherDomain.findById(id2)
otherDomain.name = "Fiddled"
if(!otherDomain.save(flush:true)){ // will also write to the db
// the transaction will be roled back
throw new RuntimeException("Panic what the hell happened")
}
}
}
lo que no estoy 100% claro con Grails es lo que sucede si una excepción comprobada es lanzada en Java recta/mundo de primavera es el comportamiento por defecto para la transacción de cometer inceptor la transacción, a través de esto, puede ser anulada en la configuración.
Nota: hay una advertencia, y es que su base de datos tiene que admitir transacciones en las tablas que está actualizando. Sí, esto es poke en MySQL :)
Esto también se aplica al método Domain.withTransaction
.
Impresionante, gracias! – RyanLynch
contento de estar de servicio –
Las excepciones personalizadas que extienden RuntimeException deberían estar bien, ¿verdad? Además, puede habilitar transacciones en MySQL estableciendo: dialect = org.hibernate.dialect.MySQLInnoDBDialect en dataSource :) – RyanLynch