Tek bir işlemde 2 DAO yöntemi nasıl yönetilir?


12

Bir röportajda birisi bana sordu: Tek bir işlemde 2 işlem / dao yöntemini nasıl yönetiriz. İstenilen yetenekler:

  1. Bunlardan herhangi biri başarısız olursa, her iki yöntemi de geri almamız gerekir.
  2. Her iki yöntem de tek bir işlemle ayrı olarak eklenebilir.
  3. Yönetim, hizmet katmanında değil DAO katmanında olmalıdır.

Bence: soru bahar işlem yönetimi ile ilgilidir.

Yanıtlar:


12

Her şeyden önce, işlem yönetimi, çok fazla performans yükü yaratacağı için (her farklı yöntemde uygun işlem izolasyon düzeyi ve yayılımı ile başa çıkmak için) DAO katmanında değil hizmet katmanında yapılmalıdır. Ayrıca, bir iş biriminin kapsamı , veri erişim katmanı yerine hizmet katmanından gelir: 2 veya daha fazla DAO ile uğraşması gereken bir iş süreci gerçekleştirdiğinizi hayal edin.

İnternette, burada , burada ve burada olduğu gibi bir yönü işaret eden birçok tartışma var .

Her neyse, bir röportaj olduğu için soruyu olduğu gibi kabul edelim. Benim açımdan, @Transactionalek açıklamayı (veya XML yapılandırmasını) her iki yöntemde ve değer içeren bir işlem yayılımı ile kullanacaksınız REQUIRED. Bu şekilde, bu yöntemlerden herhangi biri çağrıldığında ve önceden bir işlem yoksa, yeni bir işlem oluşturulur:

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}

Aynı işlem anlamına gelir foo()ve bar()paylaşmak ve 1 başarısız olursa başka bir 1 de geri döner? Biraz açıklama yapabilir misiniz?
Satish Pandey

iyi, her yöntem kendi çalışma birimini açıklar: tx her yöntemin sonunda işlenecek ve bunlardan herhangi biri bir istisna atarsa ​​geri alınır.
Alonso Dominguez

Bu nedenle @Transactional(propagation = REQUIRED), yayılma ve @Transactionalhizmet katmanı için DAO katmanı yöntemini eklememiz gerekir , ancak @Transactionalhizmet katmanını yalnızca DAO katmanına koymak yerine koyarsam , fark nedir?
atish shimpi

propagation = REQUIREDişlemsel ek açıklama yayılımı için varsayılan değerdir, bu nedenle yazmak gerekli değildir.
Daniel Higueras

2

Cevabımda yay ve çerçeveleri görmezden gelmek ..... sadece fonksiyon parametrelerini kullanma fikri. Eminim konsept [buraya çerçeve ekleyiniz] içinde uygulanabilir.

Taahhüt / geri almayı 2 DAO yönteminin dışında ele almanız gerekir. İki yöntemin işlemi / bağlantıyı girdi olarak alması gerekir.

psuedo kodu:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}

1 soru: neden Tran ther iki yöntemle parametre olarak geçiyoruz . Biraz açıklama yapabilir misiniz?
Satish Pandey

@Satish, çünkü soruda (madde # 1 ve # 2), DAO yöntemlerinin bağımsız olarak ve bağımlı olarak çağrılabilecek esnekliğe sahip olması gerekir. Method1 içinde bir yerel kapsam işlemiyle işlem yaparsanız, method2 çağrılmadan önce method1'i zaten işlemiş olduğunuz için method2'de bir şeyler ters giderse geri alamazsınız.
mike30

0

İki yöntemin bağımsız olarak da çalışması gerekir, aynı zamanda aynı işlemde de çalışabilirler. İşlemin aynı işlemde çalışması gerekiyorsa, ilk işlemi kullanır, bağımsız olarak çağrılırsa yeni bir işlem oluşturulur. Yanlışım varsa düzelt.


Lütfen bir örnek verebilir misiniz?
Jay Elston
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.