Estoy trabajando en una aplicación Java que usa Spring IoC y clases de plantilla JDBC. Tengo una clase DAO que tiene 4 métodos: m1() a m4(). m1 realiza múltiples inserciones y actualizaciones en la tabla t1, t2 m2 en mesa, m3 en t3, etc.Transacciones fáciles usando Spring JDBC?
Los métodos DAO se utilizan como sigue:
while(true)
{
//process & generate data
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
//sleep
}
Quiero las operaciones db bajo el método consecutiva 4 llamadas para ser atómicas, o bien todas las 4 tablas se actualizan correctamente o ninguna. Entonces, si hay un error al realizar operaciones en m3(), quiero deshacer todos los cambios (actualizaciones & insertos) realizados en m2 & m1.
Entonces, ¿la primavera te permite hacerlo de la siguiente manera?
while (true)
{
//process & generate data
transaction = TransactionManager.createNewTransaction();
transaction.start()
try
{
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
}
catch(DbUpdateException e)
{
transaction.rollBack();
}
transaction.end();
// sleep
}
o hay mejores maneras de hacerlo?
No creo que necesita anotar el M1, M2, etc., como @Transactional. Si alguno arroja una excepción, todo lo completado por doWork se revertirá. – Chadwick
No es necesario en este contexto, no. Pero si están haciendo actualizaciones, debe anotar que requieren transacciones, de lo contrario, puede encontrarse realizando actualizaciones no transaccionales si las llama fuera del contexto de doWork(). – cletus
¿La anotación @Transactional hace algo cuando se aplica a un método privado? –