Tôi đang cố gắng phân tích tình huống mà tôi có hai lớp học. Một lớp là ProcessImpl là điểm bắt đầu và gọi nội bộ các giao dịch con khác. Tôi không biết điều gì đang xảy ra. ProcessImpl đang nhập một số nội dung và ghi dữ liệu liên quan vào cơ sở dữ liệu.Giao dịch mùa xuân làm chậm quá trình hoàn thành
Specs
mùa xuân-orm phiên bản: 3.2.18.RELEASE.
Phiên bản JDK: 1.8.
Db: H2 (trên bất kỳ hiệu suất giống db nào được ghi lại).
Issue
Nếu tôi loại bỏ @Transactional
từ ProcessImpl.processStage()
quá trình này mất ~ 50 giây Nếu tôi giữ @Transactional
từ ProcessImpl.processStage()
quá trình này mất ~ 15 phút. Không biết tại sao điều này xảy ra. Tôi đã cố gắng giải quyết vấn đề này từ lâu nhưng không may mắn. Vui lòng xem mã bên dưới.
Yêu cầu: Toàn bộ processStage()
hoàn tất hoặc hoàn nguyên, ngay cả khi một trong các giao dịch của trẻ không thành công.
Fyi: Tôi cũng nhận được nhiều thông báo như: "Tham gia vào giao dịch hiện tại". Đã cố gắng vượt qua điều này bằng cách thêm propagation=Propagation.NESTED
vào processStage()
nhưng không hoạt động.
ProcessImpl Class.
public class ProcessImpl {
/*This is the big transaction that calls other transactional stuff from MyServiceImpl
* This is starting point you can say for the process...
*
* If we remove @Transactional from here the process is lightning fast
* With transactional : 15minutes
* Without transactional : 50 seconds
* */
@Transactional
public void processStage(){
MyServiceImpl mp = new MyServiceImpl();
//do some stuff
mp.doWork1();
//do more work
mp.doWork2();
}
}
MyServiceImpl Lớp
class MyServiceImpl{
@Transactional
public void doWork1(){
Object o = doChildWork();
// and more stuff
//calls other class services and dao layers
}
@Transactional
public void doWork2(){
//some stuff
doChildWork2();
doChildWork();
//more work
}
@Transactional
public Object doChildWork(){
return new Object(); //hypothetical, I am returning list and other collection stuff
}
@Transactional
public Object doChildWork2(){
return new Object(); //hypothetical, I am returning list and other collection stuff
}
}
Ngoài ra, ở đây tôi sẽ có được sự tự vấn đề gọi, mà không nên trong giao dịch?
Cố gắng thêm 'readonly' cho '@ Transactional' – StanislavL
Tôi đang làm rất nhiều chèn trong quá trình này cùng với các hoạt động chọn khác, vì vậy, sẽ chỉ đọc cho processStage vẫn có giá trị? – swapyonubuntu
Không, sau đó chỉ đọc không phải là một lựa chọn cho trường hợp của bạn – StanislavL