Avatar
1
Cesc Nguyễn Beginner
Cesc Nguyễn Beginner
Xử lý vấn đề Transaction trên nhiều Repositories
Hi anh chị em, chắc hẳn mọi người đã sử dụng Repository pattern rất nhiều trong lập trình rồi. Em cũng vậy, tuy nhiên em đang gặp phải một vấn đề về việc khi muốn transaction trên nhiều repositories, thì mình nên xử lý thế nào cho hiệu quả. Anh chị em có thể chia sẻ cùng em ở đây nhé ạ. Cảm ơn mọi người.
  • Answer
golang transaction repository
Remain: 5
1 Answer
Avatar
monkey Beginner
monkey Beginner
Có một cách mà anh thấy một số người hay dùng đó là ở tầng service sẽ bắt đầu transaction và sau đó gọi các repository sau đó commit tại đây, ví dụ (anh tạm dùng java để minh hoạ nhé):

class Service {
    @Transactional
    public void addUserProduct(long userId, long productId) {
       userRepo.increaseProductCount(userId);
       productRepo.updateProductOwner(productId, userId);
       userProductRepo.addUserProduct(userId, productId);
    }
}

Tuy nhiên không nên làm như vậy vì tầng service là tầng chuyên xử lý nghiệp vụ, ví dụ như tính toán, tổng hợp dữ liệu, và nó không bao giờ nên phụ thuộc vào transaction, giả sử em bổ sung thêm 1 nghiệp vụ không liên quan gì đến transaction thế này:

class Service {
    @Transactional
    public void addUserProduct(long userId, long productId) {
       Thread.sleep(2000);
       sendNewUserProductToKafka(userId, productId);
       userRepo.increaseProductCount(userId);
       productRepo.updateProductOwner(productId, userId);
       userProductRepo.addUserProduct(userId, productId);
    }
}

Thì có phải là transaction đang bị kéo dài thêm 2000 và có thể gây ra những lỗi bất ngờ thì sao.

Nên cách tốt nhất là em nên tạo ra 1 repo và gọi tổng hợp như thế này em ạ. Từ entityManager tương đương với context.Context trong go em sẽ có thể chạy các query tuỳ ý và sau đó commit 1 thể.

  • 0
  • Reply
em cảm ơn anh, đúng là hiện tại em đang start txn ở service layer và gặp những vấn đề như anh nói. Tuy nhiên, nếu dùng entityManager như anh, thì mình sẽ luôn luôn phải khởi tạo repository ở layer service phải không ạ?  –  Cesc Nguyễn 1668567714000
repository sẽ được khởi tạo ở ngoài, và sau đó được inject vào service thông qua thư viện dependency injection em ạ, hoặc em có thể set bằng tay.  –  monkey 1668568127000