2009-01-16 24 views
5

Tôi đang cố gắng tìm ra cách tốt nhất để xử lý giao dịch ở cấp đối tượng (không phải cấp cơ sở dữ liệu). Ví dụ ngắn: 4 đối tượng A, B, C và D. A bắt đầu giao dịch và gọi phương thức trong B và C. Whithin giao dịch C này cũng đang gọi D. Các phương thức được gọi là không phải lúc nào cũng tham gia vào giao dịch này, nhưng cũng có thể được gọi riêng. Có bất kỳ mẫu nào để quản lý giao dịch ở cấp đối tượng không?Mẫu quản lý giao dịch cấp đối tượng

Tôi đã không thực sự tìm thấy điều gì đó, vì vậy tôi đã đưa ra điều này: Sử dụng TransactionContext, nơi người ta có thể đăng ký TransactionListeners. Nếu một giao dịch được bắt đầu sử dụng TransactionContext, thì nó sẽ tiêm giao dịch đang chạy vào mỗi người nghe đã đăng ký, do đó sẽ sử dụng một giao dịch đang chạy hoặc ngược lại sẽ bắt đầu một giao dịch nếu cần. Bằng cách này tôi khá tự do để quyết định thời tiết tôi muốn một đối tượng tham gia vào giao dịch của tôi hay không.

Sự cố xảy ra khi có chuỗi gọi đối tượng như trên. Khi bắt đầu giao dịch, tôi chỉ biết rằng B và C phải tham gia vào giao dịch để tôi thêm chúng vào TransactionContext. Nhưng còn D thì sao? Tôi thực sự không muốn chuyển giao TransactionContext tới B và C.

Tôi sẽ đánh giá cao một số đầu vào về cách tiếp cận của tôi cũng như một số gợi ý cho các mẫu đã được chứng minh (thậm chí tốt hơn).

Trả lời

2

"Tôi không thực sự muốn chuyển giao TransactionContext tới B và C."

Tại sao không? Họ tham gia và họ giao cho các đối tượng khác.

Hoặc

  • Mọi người cần phải đăng ký. Điều đó có nghĩa là bạn phải ủy quyền đăng ký. A biết rằng nó sẽ chuyển thành BC. Mỗi người trong số họ có thể (hoặc có thể không) có thêm đại biểu để đăng ký. Điều này tương đối đơn giản để thực hiện với phương thức "RegisterYourselfAndYourDelegatees".

  • Eschew mẫu thiết kế Trình nghe. Tạo bối cảnh giao dịch và chuyển nó đi. Điều này thay thế việc đăng ký và tiêm với thiết kế đơn giản hơn một chút. Tuy nhiên, bạn sẽ cần phải có hai lớp con Ngữ cảnh - Ngữ cảnh thực và một Ngữ cảnh gốc không có gì và được sử dụng bên ngoài ngữ cảnh giao dịch.

    Điều này làm cho định nghĩa hàm của bạn phức tạp hơn một chút. Đối với Java, bạn có thể sử dụng quá trình đặt tên quá tải để có hai hàm phương thức với các chữ ký khác nhau.

    Đối với Python, đây không phải là vấn đề; ngữ cảnh là một đối số tùy chọn.

1

Spring framework (ban đầu cho Java nhưng có phiên bản .Net quá bây giờ) có thể thực hiện việc này. Các phương thức được đánh dấu là:

  • Yêu cầu giao dịch (bắt đầu một giao dịch nếu chưa có);
  • Yêu cầu giao dịch mới (luôn tạo giao dịch mới);
  • v.v.

Điều này thường được thực hiện với chú thích. Âm thanh chính xác như những gì bạn mô tả.

Khám phá Spring's transaction management.

+0

Tôi biết rằng Spring và máy chủ ứng dụng cũng đang cung cấp dịch vụ này, nhưng tôi không muốn sử dụng một trong số chúng. Nhưng cảm ơn cho con trỏ đến Spring transactionmanagemenr. Tôi sẽ đọc cái đó. – MicSim

+0

Trong Java nó là một mẫu khá chuẩn và nhiều thư viện thực hiện nó. – Loki

+0

Tại sao bạn không muốn sử dụng JTA hoặc Spring? – Loki

0

tôi muốn đề nghị: Prevayler

Prevayler is an object persistence library for Java. It is an implementation of the 
System Prevalence architectural style, in which data is kept hot in Memory with 
changes journaled for system recovery. 

Prevayler ' s architecture is illustrated in the diagram shown there. Prevayler [1] 
serves as a transactional barrier for the business objects [2] of your application, 
held in Memory. You encapsulate all modifications of your business objects into 
instances of the Transaction interface [3], much like a " command " pattern 
(though different from a command in some details of the pattern). Whenever 
you ask Prevayler to execute a transaction on your business objects [4], Prevayler 
first writes the transaction object to a journal [5] so that data is not lost if your 
system crashes. Prevayler can also write a snapshot of your entire business object 
graph [6] as often as you wish. Prevayler uses the latest snapshot together with 
the journals to automatically recover your business objects from disk [7] on 
application startup by restoring the snapshot and then re-executing every 
transaction that was originally executed after that snapshot was taken. 

Tất nhiên, bạn có thể vô hiệu hóa các cửa hàng liên tục và chỉ sử dụng các cửa hàng In-nhớ.

0

Rất khuyên bạn nên this paper bởi Andrei Alexandrescu và Petru Marginean, trình bày ScopeGuard patten. Đây là một giải pháp thanh lịch và rất mạnh mẽ để quản lý các giao dịch cụ thể khi có ngoại lệ.

Áp dụng cho vấn đề bạn đang cố gắng giải quyết ScopeGuard sẽ cho phép bạn xác định phạm vi giao dịch của mình và dễ dàng (có nghĩa là tự động) quản lý điều đó cho bạn xem giao dịch có liên quan đến các phương thức A, B, C, D hay không. phương pháp.

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