2011-08-12 7 views
6

Tôi đã sử dụng TransactionScope trong quá khứ với các ứng dụng máy khách để quay trở lại giao dịch đa bước chưa hoàn tất. Cách tiếp cận đó dường như không có khả năng làm việc trong một ứng dụng Web.Chia nhỏ giao dịch cơ sở dữ liệu nhiều bước qua nhiều yêu cầu HTTP

Có ai có thể đề xuất các cách thức thực hiện nhiều bước, trên nhiều trang, đảm bảo quay lại nếu toàn bộ quá trình chưa hoàn tất? (trình duyệt của họ gặp sự cố hoặc khi đóng trình duyệt ở giữa quá trình)

Chắc chắn, tôi có thể ghi vào bảng tạm thời, sau đó chuyển bản ghi cuối cùng sang bảng thực trong một giao dịch, nhưng chạy nguy cơ của điều kiện chủng tộc. Tôi muốn bắt đầu một giao dịch, phục vụ một số trang, mỗi trang viết một mẩu giao dịch cho (các) bảng, sau đó hoàn tất giao dịch với một cam kết, và nếu giao dịch không được hoàn thành, thì nó sẽ được khôi phục khi phiên kết thúc.

Hay tôi không nghĩ đúng cách? Gợi ý?

Vì tôi đang sử dụng MVC 3, EF 4.1 và Ninject, tôi không chắc chắn điều đó sẽ ảnh hưởng như thế nào đến giải pháp, nhưng tôi nghĩ tôi sẽ bao gồm thông tin đó.

Trả lời

8

Không có giao dịch cơ sở dữ liệu/TransactionScope trên một số trang. Ngay cả cố gắng làm điều gì đó như thế cũng là sai lầm khủng khiếp.

Bạn có hai lựa chọn để giải quyết vấn đề:

  • Sử dụng Session

    Lưu trữ dữ liệu của bạn trong phiên và duy trì nó vào cơ sở dữ liệu chỉ khi người dùng hoàn thành tất cả các bước, và khẳng định tiết kiệm . Đây chắc chắn là những gì bạn cần.]

  • Sử dụng nền tảng luồng công việc và các giao dịch chạy dài.

    Giao dịch chạy dài không phải là giao dịch cơ sở dữ liệu - chúng là giải pháp hoàn toàn tùy chỉnh, nơi bạn phải thực hiện bù trừ (cuộn lùi các giao dịch đang chạy dài) theo cách thủ công. Bạn vẫn phải phát hiện bằng cách nào đó rằng công việc của bạn nên được bù đắp, nhưng điều này là không cần thiết cho giải pháp của bạn. Đó là giải pháp mà bạn cần "giao dịch" cho nhiều phiên.

+0

Điều đó có nghĩa là bạn phải xử lý đồng thời theo cách thủ công. Điều đó có vẻ như một mùi mã với tôi. –

+0

Xử lý đồng thời thủ công trong ứng dụng web là khá phổ biến. Các giao dịch cơ sở dữ liệu nên ngắn nhất có thể - trong hầu hết các kịch bản thường gặp của phần thứ hai. Những gì bạn muốn làm có nghĩa là khóa chuyên sâu trong cơ sở dữ liệu trong vài phút = ứng dụng của bạn sẽ thực hiện rất tệ. –

1

Bạn có thể xem thiết lập nservicebus hoặc masstransit và sử dụng mặt nạ saga của chúng.

+0

một xe buýt dịch vụ có vẻ dư thừa vì tôi cũng đang sử dụng IoC có vị trí dịch vụ. –

+3

@ Mystere Điều đó không có ý nghĩa. Xe buýt dịch vụ rất khác với IOC. Sagas sẽ loại bỏ các điều kiện chủng tộc của bạn và cho phép chuyển tiếp trạng thái (thông điệp) rất rõ ràng. Tuy nhiên bạn có thể chỉ có thể lấy đi bằng cách sử dụng một bảng tạm thời. – Ryan