2009-11-06 44 views
6

Tôi đang triển khai nút hoàn tác cho một hoạt động kéo dài trên ứng dụng web. Vì hoàn tác sẽ có yêu cầu khác, tôi phải thực hiện thao tác.Làm cách nào để khôi phục một giao dịch đã được cam kết?

Có cách nào để đưa ra gợi ý về giao dịch như "có thể rollback" không? Vì vậy, sau khi giao dịch được thực hiện, tôi vẫn có thể khôi phục trong một quy trình khác nếu cần.

Nếu không, chức năng Hoàn tác sẽ phức tạp như hoạt động mà nó đang hoàn tác.

Điều này có khả thi không? Các ý tưởng khác được chào đón!

+0

Sẽ có phụ thuộc dữ liệu vào thông tin bạn đã cam kết không? –

+0

Chỉ với các khóa ngoại và dữ liệu con. Những người đó nên được xóa quá tất nhiên. nhưng các hoạt động là nguyên tử và một rollback một cách an toàn sẽ làm điều đúng. –

Trả lời

4

Ý tưởng trong trường hợp này là đăng nhập cho từng thao tác - thao tác phản đối ngược lại, trong nhật ký đặc biệt và khi bạn cần khôi phục, bạn thực sự chạy các lệnh bạn đã đăng nhập.

một số cơ sở dữ liệu có công nghệ flashback mà bạn có thể yêu cầu DB quay lại ngày và giờ nhất định. nhưng bạn cần phải hiểu cách thức hoạt động, và chắc chắn rằng nó sẽ chỉ ảnh hưởng đến dữ liệu bạn muốn và nhân viên không khác ...

Oracle Flashback

Tôi không nghĩ rằng có một công nghệ tương tự trên máy chủ SQL và có một câu trả lời SO nói rằng nó không, nhưng SQL tiếp tục phát triển ...

+0

Nếu sự kiện không xảy ra quá lâu, bạn có thể sử dụng các công cụ từ Log PI hoặc Apex SQL (Lumigent đã thực hiện tốt nhưng ngừng sản xuất sau khi thay đổi định dạng nhật ký năm 2005). Thảo luận tốt về điều này ở đây, bao gồm một số liên kết đến các bài viết về việc thực hiện nó một cách tự nhiên (giả sử một bản sao lưu tốt): http://www.developersdex.com/sql/message.asp?p=580&r=6497847 Nhiệm vụ LiteSpeed ​​có một bản sao lưu tốt tính năng kiểm tra là tốt, cho phép bạn xem dữ liệu trông như thế nào tại thời điểm sao lưu. –

+0

Nhật ký ApexSQL: http://www.apexsql.com/sql_tools_log.asp ... Nhật ký PI dường như không còn tồn tại ... Quest LiteSpeed: http://www.quest.com/litespeed-for-sql-server/ –

6

Một tùy chọn khác mà bạn có thể muốn xem xét: Nếu người dùng có thể 'hoàn tác' thao tác, bạn có thể muốn triển khai một bảng 'ý định', nơi bạn có thể lưu trữ các hoạt động đang chờ xử lý. Khi bạn đi qua luồng ứng dụng của mình, người dùng sẽ cần Chấp nhận hoặc Hoàn tác thao tác, tại thời điểm đó bạn chỉ có thể chạy giao dịch đang chờ xử lý và áp dụng nó cho cơ sở dữ liệu của bạn.

Chúng tôi có một hệ thống tương tự tại chỗ trên ứng dụng web của chúng tôi, nơi người dùng có thể gửi giao dịch để xử lý và có đến 5 giờ chiều vào ngày được lập lịch để chạy để hủy. Chúng tôi lưu trữ điều này trong bảng mục đích và xử lý bất kỳ giao dịch nào được lên lịch cho ngày hôm đó sau thời gian ngắt hàng ngày. Trong trường hợp của bạn, bạn sẽ cần một hoạt động 'Chấp nhận' hoặc 'Hoàn tác' rõ ràng từ người dùng sau 'hoạt động dài' ban đầu, do đó sẽ thay đổi quy trình của bạn một chút.

Hy vọng điều này sẽ hữu ích.

1

Tôi không chắc bạn đang sử dụng công nghệ nào ở đây, nhưng chắc chắn có những cách tốt hơn để thực hiện việc này. Bạn có thể bắt đầu bằng cách lưu trữ dữ liệu trong phiên và cam kết khi chúng ở trên trang cuối cùng. Nhiều khung công tác trong những ngày này cũng cho phép các giao dịch chạy dài kéo dài nhiều yêu cầu.

Tuy nhiên, có thể bạn sẽ muốn cam kết ở cuối mỗi trang và chỉ cần đặt một số loại cờ khi quá trình hoàn tất. Bằng cách đó, nếu có điều gì đó không ổn ở giữa người dùng có thể khôi phục và tất cả sẽ không bị mất.

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