2009-03-30 29 views
8

Tôi có một biểu mẫu mở rộng nhiều trang. Cách nó được thiết lập bây giờ không phải là lý tưởng vì nó tiết kiệm (cho cơ sở dữ liệu) mỗi trang khi nó được gửi. Vì vậy, nếu người dùng không hoàn thành biểu mẫu trên tất cả các trang sẽ có đăng ký người dùng chưa hoàn tất được lưu trong cơ sở dữ liệu.Có thể có một giao dịch cơ sở dữ liệu trải rộng nhiều yêu cầu trong đường ray không?

Tôi muốn 'rollback' các khoản tiết kiệm nếu người dùng không điền đầy đủ vào biểu mẫu.

Vậy có cách nào để thiết lập giao dịch bắt đầu khi người dùng điền vào biểu mẫu đầu tiên và kết thúc khi người dùng kết thúc trên trang cuối cùng không?

Trả lời

1

Tôi không biết câu trả lời cho câu hỏi ban đầu của bạn nhưng dù sao ...

Thay vì tiết kiệm trên tất cả các trang, tại sao không lưu tất cả các dữ liệu trong một biến phiên? Sau đó, ở cuối bạn có thể có một trang lưu dữ liệu trong phiên xuống cơ sở dữ liệu? Bằng cách này bạn không bao giờ có một phần được lưu bất cứ điều gì trong DB.

1

Tôi nghĩ rằng có giá trị trong việc lưu từng trang, vì nếu đó là quy trình chạy dài và người dùng bị gián đoạn ở giữa họ có thể muốn lưu kết quả trung gian, không cam kết của họ và chọn nơi họ rời đi sau.

Nếu bạn nghĩ đó cũng là một ý tưởng hay, thì thiết kế của bạn sẽ lưu trữ một lá cờ để cho biết liệu một phần cụ thể có phải là một phần của giao dịch dài hạn chưa hoàn thành hay không. Đặt cờ khi đoạn cuối cùng được thực hiện và nút lưu được nhấn. Đưa ra một giá trị thời gian chờ có thể nói nếu các phần trung gian đã được phê duyệt "cuối cùng lưu" sau một khoảng thời gian nhất định mà chúng sẽ bị xóa.

1

Mở giao dịch cơ sở dữ liệu có thể trải rộng nhiều yêu cầu là một ý tưởng tồi. Hãy xem xét tình huống mà người dùng chỉ đóng trình duyệt trước khi giao dịch của bạn được cam kết. Bạn bị bỏ lại với một giao dịch mồ côi không phải là việc quay vòng cũng không được cam kết.

Chỉ cần đặt cờ trong cơ sở dữ liệu giống như REG_COMPLETE, chỉ được đặt ở trang cuối cùng của quy trình đăng ký. Sau đó, bạn có thể lọc/chà/bất cứ điều gì bạn thích với hồ sơ không đầy đủ ... có thể gửi cho họ một email nhắc họ kết thúc?

2

Để trả lời câu hỏi cụ thể, tôi không nghĩ có cách nào để thiết lập giao dịch theo nghĩa cơ sở dữ liệu sẽ thực hiện những gì bạn muốn. Hãy suy nghĩ về nó và bạn sẽ thấy lý do tại sao: không có gì đảm bảo rằng các phần khác nhau của hoạt động nhiều trang của bạn sẽ được xử lý bởi cùng một quá trình. Hoặc thậm chí rất có thể ngay cả cùng một máy chủ. Nếu yêu cầu kéo dài các kết nối cơ sở dữ liệu, vì nó sẽ trong tình huống này, các phần không được cam kết từ một kết nối sẽ không nhìn thấy được với các kết nối khác.

Cũng như các ý tưởng đã được đề cập, tôi sẽ xem xét sử dụng một hoặc nhiều bảng "dàn" để giữ dữ liệu chưa hoàn tất đã được nhập. Sau đó, khi người dùng kết thúc, một giao dịch có thể áp dụng dữ liệu cho các bảng vĩnh viễn và xóa dữ liệu dàn dựng. Dữ liệu không đầy đủ có thể được xóa trên tiêu chí độ tuổi theo quy trình nền sau khi bạn tự tin rằng phiên đã bị chấm dứt hoặc được giữ cho đến khi người dùng quay lại, điều đó sẽ đáp ứng tốt hơn các yêu cầu của bạn.

Tôi muốn hướng đến phương pháp này đặc biệt nếu tôi dự kiến ​​có giao dịch không đầy đủ thường xuyên, vì cách này tôi không phải xử lý dữ liệu không đầy đủ trong các mô hình chính của mình.

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