2013-04-17 28 views
5

Tôi có một kiến ​​trúc 3-tier trông gần như thế này:ranh giới giao dịch trong một kiến ​​trúc N-tier

Khách hàng -> Kinh doanh -> Dữ liệu

nên giao dịch lý tưởng bắt đầu từ đâu?

Một trường tư tưởng cho rằng giao dịch chỉ nên bắt đầu ở đầu lớp dữ liệu. Lớp nghiệp vụ chỉ thao túng các đối tượng nghiệp vụ với logic nghiệp vụ và không bao giờ biết về các giao dịch. Doanh nghiệp thực hiện tất cả công việc của mình để thao tác các đối tượng và sau đó đưa chúng đến lớp Dữ liệu để được duy trì. Đó là một triết lý hơi yên tĩnh áp dụng cho các lớp thấp hơn.

Một trường phái tư tưởng khác cho rằng giao dịch nên bắt đầu ở đầu lớp Doanh nghiệp. Lớp nghiệp vụ định nghĩa các đơn vị logic của công việc, không phải lớp dữ liệu, bởi vì một đơn vị logic của công việc đôi khi chứa logic nghiệp vụ, không chỉ logic dữ liệu.

Tôi thích ý tưởng đẩy mối quan tâm giao dịch ở mức thấp nhất có thể. Nhưng tôi cũng tìm thấy nó có thể đòi hỏi thêm nỗ lực và những thách thức thiết kế để thử và giữ logic kinh doanh ra khỏi lớp dữ liệu, trừ khi nó chỉ là các hoạt động CRUD. Nếu bạn áp dụng các mẫu thiết kế RESTful với một búa tạ, bạn có thể làm cho nó để các ứng dụng của bạn có rất ít hoạt động phi CRUD.

Thậm chí còn có trường thứ 3 của tư tưởng nói rằng Khách hàng có thể bắt đầu giao dịch để có thể kết hợp nhiều hoạt động kinh doanh khi cần. Nhưng bây giờ khách hàng đang xác định đơn vị công việc? Đó không phải là một mối quan tâm kinh doanh?

Một trường tư tưởng thứ tư nói rằng khách hàng của tôi có thể chỉ là các thành phần SOA có thể tham gia vào một giao dịch XA bắt đầu ngay cả bên ngoài khách hàng !!

nhà phát triển của chúng tôi muốn một số tiêu chuẩn hơn bê tông hơn là chỉ "Bắt đầu giao dịch bất cứ nơi nào bạn cảm thấy như"

Có ai có bất kỳ ý kiến ​​hoặc góp ý về vấn đề này?

Cảm ơn!

+0

FWIW, Java EE bắt đầu giao dịch với Đậu phiên, có hiệu quả là lớp Doanh nghiệp. (Nhưng Java EE thường tạo ra các lựa chọn thiết kế có lợi cho việc tích hợp với chi phí tách) – Beaker

Trả lời

2

Giao dịch là một khái niệm kinh doanh và cần được phối hợp từ bên trong Bậc nghiệp vụ.

Thao tác cách ly đối tượng thường ít có lợi và kéo dài thao tác giữa nhiều loại đối tượng đã là giao dịch. Vì vậy, trường học đầu tiên của tư tưởng là đối phó với các trường hợp thực sự cơ bản.

Khi Bậc doanh nghiệp của bạn đang xử lý các giao dịch, điều đó thực sự không quan trọng ai bắt đầu giao dịch: khách hàng hoặc dịch vụ khác. Các giao dịch chạy (phân phối) dài cũng chỉ có thể được hỗ trợ khi Business Tier biết về chúng.

1

Trong

Khách hàng -> Kinh doanh -> Dữ liệu

kiến ​​trúc, nó luôn luôn là tốt hơn để xác định các giao dịch trên lớp kinh doanh. Tôi sẽ đề nghị rằng giao dịch được xác định như vậy rằng dịch vụ kinh doanh hoặc là bắt đầu một giao dịch mới hoặc tham gia vào giao dịch hiện tại nếu một giao dịch đã được bắt đầu. Việc này sẽ xử lý các trường hợp dịch vụ kinh doanh được gọi bởi một dịch vụ kinh doanh khác.

Có ranh giới giao dịch tại các lớp dữ liệu thất bại nếu các lớp kinh doanh thực hiện nhiều cuộc gọi lớp dữ liệu như là một phần của cùng một yêu cầu, như

client1-> business1 => data1, business1 => data2

+0

Đối số truy cập là bạn có thể cấu trúc lại để không bao giờ cần phải gọi hai phương thức dữ liệu khác nhau từ phương thức kinh doanh. Điều này giả định phương pháp kinh doanh của bạn rất giới hạn trong phạm vi bản thân. Tôi không hoàn toàn đồng ý với lập luận này, nhưng tôi đã nhìn thấy một mẫu thiết kế RESTful được áp dụng với sự nhiệt tình như vậy mà nó thực sự đã thúc đẩy 99% sự phức tạp giữa nhiều miền trong một ứng dụng. Nó có đáng không? Không chắc. :) – Beaker

+0

"refactor để làm không bao giờ cần phải gọi hai phương pháp dữ liệu khác nhau" trong bất kỳ dịch vụ là một ý tưởng rất lý tưởng. Theo tôi, đối với trường hợp như vậy, không cần lập kế hoạch nhiều về giao dịch. Trong các phương thức lớp dữ liệu, chỉ cần tạo một connection.setautocommit ("false") ở đầu phương thức và sau đó đặt nó trở lại true hoặc rollback trong khối cuối cùng. Các ứng dụng và quan hệ db hiếm khi đơn giản. – techuser

Các vấn đề liên quan