SORU
13 Aralık 2011, Salı


Bahar @İşlem - izolasyon, yayılma

Biri ne olduğunu açıklayabiliryalıtım&yayılımparametreleri gerçek hayattan örnek) @Transactional ek açıklama için. Varsayılan değerleri değiştirmek için seçmeliyim temelde.

CEVAP
13 Aralık 2011, Salı


Cevap için güzel bir soru olmasa da, önemsiz biri.

Propagation

Hareketleri birbirleriyle nasıl ilişki tanımlar. Sık kullanılan seçenekler

  • Required: Kodu her zaman bir hareket içinde çalışır. Yeni bir hareket oluşturmak veya geçerli bir yeniden.
  • Requires_new: Kodu her zaman yeni bir işlem içinde çalışır. Eğer mevcut değilse, işlem askıda.

Isolation

Tanımlar işlemler arasında veri sözleşme.

  • Read Uncommitted: kirli Sağlar okur
  • Read Committed: kirli okuma izin vermez
  • Repeatable Read: Eğer bir satırda iki kez aynı transaciton okumak İse, sonuç her zaman aynı olacaktır
  • Serializable: bir dizi işlem Gerçekleştirir

Farklı düzeylerde bir çok iş parçacıklı bir uygulama içinde farklı performans özelliklerine sahip. Eğer iyi bir seçeneği seçmek mümkün olacak dirty reads kavramını anlamak bence.


Kirli bir okuma ortaya çıkabilir örneğin

  thread 1   thread 2      
      |         |
    write(x)    |
      |         |
      |        read(x)
      |         |
    rollback    |
      v         v 
           value (x) is now dirty (incorrect)

Yani aklı başında varsayılan (eğer böyle olabileceğini iddia olabilir Read Comitted, sadece sağlar okuma değerleri olan zaten taahhüt ile çalışan diğer işlemler, kombinasyon ile bir yalıtım düzeyi Required. Sonra da eğer uygulama diğer ihtiyaçları varsa oradan çalışabilirsiniz.


Her zaman yeni bir hareket provideService rutin girerken oluşturulur ve ayrılırken tamamladığı pratik bir örnek.

public class FooService {
    private Repository repo1;
    private Repository repo2;

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void provideService() {
        repo1.retrieveFoo();
        repo2.retrieveFoo();
    }
}

Bunun yerine Required kullanmış biz hareket eğer bu işlem rutin girerken zaten açık olsaydı, 24**. rollback bir sonucu birkaç infaz aynı hareket içinde yer alabilir olarak farklı olabileceğini unutmayın.


Kolay bir test ile davranışlarını doğrulamak ve sonuçları yayma düzeyleri ile farklı nasıl görebilirsiniz

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:/fooService.xml")
public class FooServiceTests {

    private @Autowired TransactionManager transactionManager;
    private @Autowired FooService fooService;

    @Test
    public void testProvideService() {
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        fooService.provideService();
        transactionManager.rollback(status);
        // assert repository values are unchanged ... 
}

Üretim düzeyi

  • Requires new fooService.provideService() beklenirDEĞİLyarattı beri geri kendi alt işlem.

  • Required Her şey geri alındı ve mağaza değişmeden geri geri gidiyordum beklenir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • Nickcidious

    Nickcidious

    6 HAZİRAN 2011
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008