6

Bir çözüm bulmaya çalıştım ama iyi bir şey bulamıyorum. Ben hazırda davranışını değerlendirmek istiyorum hangi karmaşık senaryo var iyimser kilitleme 'elimdenyay başlangıç ​​entegrasyon testinde paralel işlemler

entegrasyon testlerinde iyi bir sette olacağını bunun için mükemmel bir yer, kilitleme kötümser vs ama Paralel işlemlere başlamak için temiz bir yol bulabiliyor gibi görünüyor.

  • manuel olarak nasıl konu oluşturma ve SessionFactory nesneleri enjekte olmadan bahar entegrasyon testi içinde 2 paralel işlem oluşturabilirsiniz.

En az 2 iş parçacığı oluşturmadan 2 paralel işlem oluşturmanın bir yolunu bulamadığımı unutmayın (belki bir yol var, umarım bana bunun bir örneğini gösterebilirsiniz). Yeterli alan yorumlarda orada değil gibi bir cevap olarak bu ekleme

+0

En azından bir ek iş parçacığına ihtiyacınız olacağı için yapamazsınız. İşlemler ve kaynak yönetimi iş parçacığına dayalı, yani 2 iş parçacığı olmadığı sürece zor ve çok kıvrık olacak .. –

+0

Tamam, bu yüzden yumurtlamadan hiçbir yol yoktur. Bunu kullanmak için yarar? Ya da bir yerde kod örneği var mı? – victor

+0

Eğer __parallel__ diyorsan kodunda 2 tane konu olmalı, aksi halde kötü bir test yapıyorsun. Neden yeni konu oluşturmak istemiyorsunuz? – rascio

cevap

3

:

Eskiden farklı EntityManager/Oturumu oluşturmak ve daha sonra bu enjekte ederek vanilya Spring üzerinde test ettik. Bunu bir Spring entegrasyon testinden nasıl yapabileceğinizi bilmiyorum ama bir fikir ortaya çıkarabilir.

Aşağıdaki kodda Hesap, sürümlendirilmiş küçük bir nesnedir. Bahar Entegrasyonu akışı (veya herhangi bir şekilde adlandırılan) özel bir varlık yöneticisi ile örneklenebilirse, aynı şeyi gerçekleştirebilirsiniz.

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(); 
}