Tôi đang làm việc trên một ứng dụng Java có sử dụng các lớp Spring IoC và JDBC Template. Tôi có một lớp DAO có 4 phương thức: m1() đến m4(). m1 thực hiện nhiều chèn và cập nhật trên bảng t1, t2 m2 trên bàn, m3 trên t3 vvGiao dịch dễ dàng bằng Spring JDBC?
Các phương pháp DAO được sử dụng như sau:
while(true)
{
//process & generate data
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
//sleep
}
Tôi muốn các hoạt động db dưới 4 phương pháp liên tiếp gọi là nguyên tử, hoặc tất cả 4 bảng được cập nhật thành công hoặc không có gì. Vì vậy, nếu có lỗi trong khi thực hiện các hoạt động theo m3(), tôi muốn khôi phục tất cả các thay đổi (cập nhật & chèn) được thực hiện trong m2 & m1.
Vậy mùa xuân cho phép bạn làm điều đó theo cách sau?
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
}
hay có những cách tốt hơn để làm điều đó?
Tôi không tin bạn cần chú thích m1, m2, v.v ... dưới dạng @Transactional. Nếu có một ngoại lệ, mọi thứ đã được hoàn thành bởi doWork sẽ được khôi phục. – Chadwick
Bạn không cần phải trong ngữ cảnh này, không. Nhưng nếu họ đang thực hiện cập nhật, bạn nên chú thích chúng như yêu cầu giao dịch, nếu không bạn có thể thấy mình đang thực hiện cập nhật phi giao dịch nếu bạn gọi chúng bên ngoài ngữ cảnh doWork(). – cletus
Chú thích @Transactional có làm bất kỳ điều gì khi được áp dụng cho phương pháp riêng tư không? –