Làm cách nào để quản lý 2 phương thức DAO trong một giao dịch?


12

Trong một cuộc phỏng vấn có người hỏi tôi: Làm thế nào để chúng tôi quản lý 2 phương thức giao dịch / dao trong một giao dịch. Khả năng mong muốn:

  1. Nếu bất kỳ ai trong số họ thất bại, chúng tôi cần phải khôi phục cả hai phương pháp.
  2. Cả hai phương thức có thể được gọi riêng kèm theo một giao dịch.
  3. Việc quản lý phải ở trên lớp DAO, không phải trên lớp dịch vụ.

Tôi nghĩ: câu hỏi liên quan đến quản lý giao dịch mùa xuân.

Câu trả lời:


12

Trước hết, việc quản lý giao dịch nên được thực hiện trên lớp dịch vụ, chứ không phải trên lớp DAO vì điều đó sẽ tạo ra nhiều chi phí hiệu năng (để xử lý mức độ cách ly giao dịch phù hợp và lan truyền ở mỗi phương thức khác nhau). Ngoài ra, phạm vi của một đơn vị công việc đến từ lớp dịch vụ thay vì lớp truy cập dữ liệu: hãy tưởng tượng thực hiện một quy trình kinh doanh cần xử lý từ 2 DAO trở lên.

Có rất nhiều cuộc thảo luận trên Internet chỉ ra hướng đó như ở đây , ở đâyở đây .

Dù sao, vì đó là một cuộc phỏng vấn, hãy chấp nhận câu hỏi như vậy. Theo quan điểm của tôi, bạn sẽ sử dụng @Transactionalchú thích (hoặc cấu hình XML) trong cả hai phương thức và với việc truyền bá giao dịch có REQUIREDgiá trị. Theo cách đó, khi bất kỳ phương thức nào được gọi và nếu không có giao dịch nào trước đó, một giao dịch mới sẽ được tạo:

@Transactional
class MyDAO {

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

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

}

Có phải nó có nghĩa foo()bar()chia sẻ cùng một giao dịch và nếu 1 thất bại thì 1 khác cũng sẽ quay trở lại? Bạn có thể cung cấp một số làm rõ?
Satish Pandey

tốt, mỗi phương thức tuyên bố đơn vị công việc riêng của mình: tx sẽ được cam kết ở cuối mỗi phương thức và nếu bất kỳ phương thức nào ném ra một ngoại lệ thì nó sẽ được khôi phục.
Alonso Toduez

Vì vậy, chúng ta cần thêm @Transactional(propagation = REQUIRED)vào phương thức lớp DAO để nhân giống và @Transactionaltrên lớp dịch vụ, nhưng nếu tôi chỉ đặt @Transactionaltrên lớp dịch vụ thay vì đưa vào lớp DAO, thì sự khác biệt là gì?
atish shimpi

propagation = REQUIREDlà giá trị mặc định cho việc truyền chú thích giao dịch, do đó không cần thiết phải viết nó.
Daniel Higueras

2

Bỏ qua mùa xuân và các khung trong câu trả lời của tôi ..... chỉ là ý tưởng cơ bản của việc sử dụng các tham số hàm. Tôi chắc rằng khái niệm này có thể áp dụng trong [chèn khung ở đây].

Bạn sẽ cần xử lý cam kết / rollback bên ngoài 2 phương thức DAO. Hai phương thức sẽ cần lấy giao dịch / kết nối làm đầu vào.

mã 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 câu hỏi: tại sao chúng ta truyền qua Tran tnhư một tham số với cả hai phương thức. Bạn có thể cung cấp một số lời giải thích?
Satish Pandey

@Satish, vì trong câu hỏi (mục số 1 và số 2), các phương thức DAO cần phải có tính linh hoạt để được gọi độc lập cũng như phụ thuộc. Nếu bạn cam kết bên trong phương thức 1 với giao dịch phạm vi cục bộ thì bạn không thể quay lại nếu có sự cố xảy ra trong phương thức 2 vì bạn đã cam kết phương thức 1 trước khi phương thức 2 được gọi.
mike30

0

Có khả năng hai phương thức sẽ hoạt động độc lập đồng thời có thể chạy trong cùng một giao dịch. Vì vậy, chúng tôi cần sử dụng Tuyên truyền-Bắt buộc. Nếu giao dịch phải chạy trong cùng một giao dịch thì nó sẽ sử dụng giao dịch đầu tiên khác, một giao dịch mới được tạo nếu được gọi độc lập. Đúng nếu tôi đã sai lầm.


Bạn có thể cung cấp một ví dụ xin vui lòng?
Jay Elston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.