@Transactional (propagation = Propagation.REQUIRED)


Yanıtlar:


65

Yayılma ayarı PROPAGATION_REQUIRED olduğunda, ayarın uygulandığı her yöntem için mantıksal bir işlem kapsamı oluşturulur. Bu tür mantıksal işlem kapsamlarının her biri, yalnızca geri alma durumunu ayrı ayrı belirleyebilir ve bir dış işlem kapsamı, iç işlem kapsamından mantıksal olarak bağımsızdır. Elbette, standart PROPAGATION_REQUIRED davranışı durumunda, tüm bu kapsamlar aynı fiziksel işlemle eşleştirilecektir. Bu nedenle, iç işlem kapsamındaki yalnızca geri alma işaretçisi, dış işlemin gerçekten tamamlama şansını etkiler (beklediğiniz gibi).

görüntü açıklamasını buraya girin

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


167

Spring Docs'da sağlananların ötesinde kullanımla ilgili meslekten olmayan bir açıklamaya ihtiyacınız varsa

Bu kodu düşünün ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

DoSomething () çağrıldığında, yürütülmeden önce veritabanında bir İşlem başlatması gerektiğini bilir. Bu yöntemi arayan kişi zaten bir İşlem başlattıysa, bu yöntem aynı fiziksel İşlemi mevcut veritabanı bağlantısında kullanacaktır .

Bu @Transactionalaçıklama, kodunuz çalıştırıldığında bir İşlem olması gerektiğini söylemenin bir yolunu sağlar . Biri olmadan çalışmayacağından, kodunuzda veritabanınızda eksik verilerle kalmayacağınız veya bir istisna olursa bir şeyi temizlemeniz gerekmeyeceği varsayımını yapabilirsiniz.

İşlem yönetimi oldukça karmaşık bir konudur, bu yüzden umarım bu basitleştirilmiş cevap yardımcı olur



DAO katmanını bildirmek ve ona erişmek için proxy tabanlı yapılandırma kullanıyorsa, DAO sınıfındaki yöntem de @Transactional ile açıklanmalıdır.
Kurapika

@TransactionalHizmet katmanınıza eklediyseniz , @Transactionalbu işlem içinde çağrılan DAO yöntemlerini de eklemenize gerek yoktur .
Brad

eğer doSomething()herhangi @Transactional olmadan çağıran bir başka iç içe yöntem bu aynı işlem de o çağıran yöntemleri için kullanılacak olacak?
thisarattr

Evet, yuvalanmış bir yöntemi yürütmek için aynı İş Parçacığı kullanıldığı sürece (yani, açıkça yeni bir İş Parçacığı oluşturmuyorsunuz). Bunun nedeni, Spring işlemlerinin ThreadLocal değişkenleri kullanılarak mevcut İş Parçacığına bağlanmasıdır
Brad

15

Spring uygulamalarında, <tx:annotation-driven/>herhangi bir sınıf / yöntemi kullanarak açıklama tabanlı işlem desteğini etkinleştirirseniz ve herhangi bir sınıf / yöntemi @Transactional (propagation = Propagation.REQUIRED) ile açıklarsanız, Spring çerçevesi bir işlem başlatır ve yöntemi çalıştırır ve işlemi gerçekleştirir. Herhangi bir RuntimeException meydana gelirse, işlem geri alınacaktır.

Aslında propagation = Propagation.REQUIRED, varsayılan yayılma seviyesidir, açıkça belirtmenize gerek yoktur.

Daha fazla bilgi için: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


5

İşlem yönetimi için benimsenen çeşitli işlem ayarlarını ve davranışları REQUIRED, ISOLATIONvb. Anlamak için işlem yönetiminin temellerini anlamanız gerekir.

Açıklama hakkında daha fazla bilgi için İşlem yönetimi bölümünü okuyun .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.