6

Tôi đã tìm kiếm một giải pháp nhưng dường như không thể tìm được giải pháp tốt nhất. Tôi có một kịch bản phức tạp trong đó tôi muốn đánh giá hành vi của Hibernate lạc khóa vs bi quan khóamùa xuân bắt đầu giao dịch song song trong thử nghiệm tích hợp

Nơi hoàn hảo để làm điều này sẽ được trong một tập tốt các bài kiểm tra tích hợp, nhưng tôi có thể' t dường như có thể tìm thấy một cách sạch sẽ để bắt đầu các giao dịch song song.

  • Làm thế nào tôi có thể tạo ra 2 giao dịch song song trong một thử nghiệm hội nhập mùa xuân mà không tự tạo Chủ đề và tiêm đối tượng SessionFactory.

Lưu ý rằng tôi chưa tìm thấy cách tạo 2 giao dịch song song mà không sinh ra ít nhất 2 luồng (có thể có một cách, tôi hy vọng bạn có thể cho tôi xem ví dụ về điều đó).

+0

Bạn không thể, vì bạn sẽ cần ít nhất một chuỗi bổ sung. Giao dịch và quản lý tài nguyên là chủ đề dựa trên, miễn là bạn không có 2 chủ đề, nó sẽ khó khăn và rất phức tạp .. –

+0

OK vì vậy không có cách nào mà không có chủ đề sinh sản ... Có thử nghiệm mùa xuân không tiện ích để sử dụng để làm điều này? Hoặc một số ví dụ mã ở đâu đó? – victor

+0

nếu bạn nói __parallel__ bạn phải có 2 chủ đề trong mã của bạn, nếu không bạn đang làm bài kiểm tra không tốt. Tại sao bạn không muốn tạo chủ đề mới? – rascio

Trả lời

3

Thêm này như một câu trả lời như không có đủ không gian trên các ý kiến:

Trong quá khứ, tôi đã thử nghiệm trên vani mùa xuân bằng cách tạo EntityManager khác nhau/phiên và sau đó tiêm những. Tôi không chắc làm thế nào bạn có thể làm điều này từ một thử nghiệm tích hợp mùa xuân, nhưng nó có thể gây ra một ý tưởng.

Trong mã sau, Tài khoản là một đối tượng nhỏ được phiên bản. Bạn có thể đạt được điều tương tự, nếu luồng tích hợp Spring (hoặc bất cứ thứ gì được gọi) có thể được khởi tạo với một trình quản lý thực thể tùy chỉnh.

public void shouldThrowOptimisticLockException() { 
     EntityManager em1 = emf().createEntityManager(); 
     EntityManager em2 = emf().createEntityManager(); 
     EntityTransaction tx1 = em1.getTransaction(); 
     tx1.begin(); 

     Account account = new Account(); 
     account.setName("Jack"); 
     account.updateAudit("Tim"); 

     em1.persist(account); 
     tx1.commit(); 


     tx1.begin(); 
     Account account1 = em1.find(Account.class, 1L); 
     account1.setName("Peter"); 

     EntityTransaction tx2 = em2.getTransaction(); 
     tx2.begin(); 
     Account account2 = em2.find(Account.class, 1L); 
     account2.setName("Clark"); 

     tx2.commit(); 
     em2.close(); 

     tx1.commit(); //exception is thrown here 
     em1.close(); 
} 
Các vấn đề liên quan