วิธีการจัดการ 2 DAO วิธีในการทำธุรกรรมเดียว?


12

ในการสัมภาษณ์มีคนถามฉัน: เราจะจัดการวิธีการทำธุรกรรม / dao 2 วิธีในการทำธุรกรรมเดียวได้อย่างไร ความสามารถที่ต้องการ:

  1. หากทุกคนล้มเหลวเราจำเป็นต้องย้อนกลับทั้งสองวิธี
  2. ทั้งสองวิธีสามารถเรียกแยกแนบกับธุรกรรมเดียว
  3. การจัดการควรอยู่ในชั้น DAO ไม่ใช่ในชั้นบริการ

ฉันคิดว่า: คำถามเกี่ยวข้องกับการจัดการธุรกรรมในฤดูใบไม้ผลิ

คำตอบ:


12

ก่อนอื่นการจัดการธุรกรรมควรทำในเลเยอร์บริการไม่ใช่ในเลเยอร์ DAO ซึ่งจะสร้างค่าใช้จ่ายประสิทธิภาพจำนวนมาก (เพื่อจัดการกับระดับการแยกธุรกรรมที่เหมาะสมและการเผยแพร่ในแต่ละวิธีที่ต่างกัน) นอกจากนี้ขอบเขตของหน่วยงานยังมาจากชั้นบริการแทนที่จะเป็นชั้นการเข้าถึงข้อมูล: ลองนึกภาพการดำเนินกระบวนการทางธุรกิจที่ต้องจัดการกับ DAO 2 ตัวขึ้นไป

มีจำนวนมากของการสนทนาในอินเทอร์เน็ตคือว่าจุดไปในทิศทางที่เป็นที่นี่ , ที่นี่และที่นี่

อย่างไรก็ตามเนื่องจากเป็นการสัมภาษณ์เราจะยอมรับคำถามดังกล่าว จากมุมมองของฉันคุณจะใช้@Transactionalคำอธิบายประกอบ (หรือการกำหนดค่า XML) ในทั้งสองวิธีและด้วยการเผยแพร่ธุรกรรมที่มีREQUIREDค่า ด้วยวิธีนี้เมื่อมีการเรียกใช้เมธอดเหล่านั้นและหากไม่มีธุรกรรมก่อนหน้านี้ธุรกรรมใหม่จะถูกสร้างขึ้น:

@Transactional
class MyDAO {

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

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

}

มันหมายถึงfoo()และbar()แบ่งปันธุรกรรมเดียวกันและหาก 1 ล้มเหลวอีก 1 จะย้อนกลับหรือไม่ คุณช่วยอธิบายได้ไหม
Satish Pandey

ดีแต่ละวิธีประกาศหน่วยงานของตนเอง: tx จะกระทำเมื่อสิ้นสุดแต่ละวิธีและหากวิธีใดวิธีหนึ่งยกเว้นข้อผิดพลาดก็จะถูกยกเลิก
Alonso Dominguez

ดังนั้นเราจำเป็นต้องเพิ่ม@Transactional(propagation = REQUIRED)วิธีการเลเยอร์ DAO สำหรับการเผยแพร่และ@Transactionalบริการชั้น แต่ถ้าฉันใส่@Transactionalในชั้นบริการเท่านั้นแทนที่จะใส่ในชั้น DAO ความแตกต่างคืออะไร?
atish shimpi

propagation = REQUIREDเป็นค่าเริ่มต้นสำหรับการเผยแพร่คำอธิบายประกอบของทรานแซคชันดังนั้นจึงไม่จำเป็นต้องเขียน
Daniel Higueras

2

ไม่สนใจสปริงและกรอบในคำตอบของฉัน ..... แค่แนวคิดพื้นฐานของการใช้พารามิเตอร์ฟังก์ชัน ฉันแน่ใจว่าแนวคิดสามารถนำไปใช้ภายใน [แทรกกรอบงานที่นี่]

คุณจะต้องจัดการคอมมิชชัน / ย้อนกลับนอกเมธอด 2 DAO ทั้ง 2 วิธีจะต้องใช้การทำธุรกรรม / การเชื่อมต่อเป็นอินพุต

รหัส psuedo:

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 คำถาม: ทำไมเราจึงผ่านTran tเป็นพารามิเตอร์ที่มีทั้งสองวิธี คุณสามารถให้คำอธิบายได้ไหม?
Satish Pandey

@Satish เนื่องจากในคำถาม (รายการ # 1 และ # 2) วิธีการ DAO จำเป็นต้องมีความยืดหยุ่นในการเรียกใช้อย่างอิสระและพึ่งพาได้ หากคุณกระทำภายใน method1 ด้วยทรานแซคชันโลคอลขอบเขตคุณจะไม่สามารถย้อนกลับได้หากมีบางอย่างผิดพลาดใน method2 เนื่องจากคุณได้ยอมรับ method1 แล้วก่อนที่ method2 จะถูกเรียกใช้
mike30

0

มีโอกาสที่สองวิธีควรทำงานอย่างอิสระในเวลาเดียวกันอาจมีการทำธุรกรรมเดียวกันดังนั้นเราจำเป็นต้องใช้การขยายพันธุ์ที่จำเป็น หากการทำธุรกรรมนั้นมีการดำเนินการในการทำธุรกรรมเดียวกันมันจะใช้การทำธุรกรรมครั้งแรกมิฉะนั้นการทำธุรกรรมใหม่จะถูกสร้างขึ้นหากเรียกใช้อย่างอิสระ ถูกต้องฉันถ้าฉันผิด


คุณช่วยยกตัวอย่างได้ไหม
Jay Elston
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.