Tôi có một phương pháp mà có propagation = Propagation.REQUIRES_NEW
bất động sản giao dịch:giao dịch mùa xuân YÊU CẦU vs REQUIRES_NEW: Rollback Transaction
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
//Some logic here that requires modification in DB
}
Phương pháp này có thể được gọi nhiều lần cùng một lúc, và cho mỗi giao dịch nếu xảy ra lỗi hơn nó được khôi phục (độc lập với các giao dịch khác).
Vấn đề là điều này có thể buộc Spring tạo nhiều giao dịch, ngay cả khi có giao dịch khác và có thể gây ra một số vấn đề về hiệu suất.
Java doc của propagation = Propagation.REQUIRED
nói: Support a current transaction, create a new one if none exists.
Điều này dường như giải quyết vấn đề hiệu suất, đúng không?
Còn vấn đề về rollback thì sao? Điều gì sẽ xảy ra nếu một cuộc gọi phương thức mới cuộn lại trong khi sử dụng một giao dịch hiện có? sẽ không khôi phục lại toàn bộ giao dịch ngay cả các cuộc gọi trước đó?
[EDIT] Tôi đoán câu hỏi của tôi là không đủ rõ ràng:
Chúng tôi có hàng trăm khách hàng kết nối với máy chủ của chúng tôi.
Đối với mỗi khách hàng, chúng tôi cần gửi phản hồi về giao dịch (OK hoặc ngoại lệ -> rollback).
Câu hỏi của tôi là: nếu tôi sử dụng REQUIRED
, điều đó có nghĩa là chỉ một giao dịch được sử dụng và nếu khách hàng thứ 100 gặp phải sự cố thì giao dịch của khách hàng thứ nhất sẽ quay trở lại?
đó là điểm của REQUIRES_NEW, để tạo giao dịch mới mỗi khi phương thức được gọi. Và có, nếu bạn đã YÊU CẦU và giao dịch được quay trở lại, nó sẽ quay trở lại toàn bộ điều. –
@DenisTulskiy toàn bộ mọi thứ là mọi cuộc gọi trước đó cho fonction đó, hoặc ngăn xếp cuộc gọi hiện tại? –
@jidma: toàn bộ giao dịch, xem câu trả lời của @ Eugen, nếu 'createUser' là phương thức đầu tiên mà mã khách hàng của bạn gọi, thì REQUIRES_NEW và YÊU CẦU là cùng một điều –