2011-11-19 33 views
13

Tôi đã sử dụng thư viện STM của Haskell và tôi thực sự thích khả năng soạn các giao dịch và tính chất chung "bạn không thể-làm-sai" của STM.Sử dụng các giao dịch STM và Cơ sở dữ liệu với nhau

Vì lý do chính đáng, STM không cho phép các hành động IO trong giao dịch. Không có cách nào để thử lại một hành động IO. (chèn Khởi chạy tên lửa tham chiếu ở đây). Mặt khác, các giao dịch cơ sở dữ liệu có một số đảm bảo nguyên tử rất giống nhau. Có cách nào được chấp nhận để sử dụng cả hai với nhau?

Trả lời

11

Việc xen kẽ các loại giao dịch khác nhau thành một khái niệm giao dịch đơn lẻ được gọi là "tăng cường giao dịch" và không có cách nào tuyệt vời để thực hiện nó trong STM của Haskell tại thời điểm này. Tuy nhiên, có một cách để xây dựng các hành động chỉ được thực hiện trên cam kết hoặc chỉ khi thử lại: http://hackage.haskell.org/package/stm-io-hooks

Ngoài ra, bạn có thể thử dự án chạng vạng, cung cấp một "chạng vạng" rõ ràng giữa các giao dịch kết thúc và cam kết thực tế. Theo như tôi biết, mã được cung cấp có nhiều triển khai tham chiếu hơn là mã được điều chỉnh cho hiệu suất, tuy nhiên: http://proglang.informatik.uni-freiburg.de/projects/twilight/

Tuy nhiên, tùy thuộc vào ứng dụng của bạn, nó có thể trở nên nhanh chóng cho mục đích của bạn.

5

Một số trợ giúp tổng quát từ những người đã không xử lý cơ sở dữ liệu hơn nhiều:

Bạn về mặt kỹ thuật có thể sử dụng unsafeIOToSTM, vì vậy nếu bạn được đảm bảo số nguyên tử bằng các hành động IO làm biến đổi cơ sở dữ liệu, nó phải là tốt. Chỉ cần viết một cây cầu sử dụng unsafeIOToSTM và sau đó sử dụng cây cầu đó trong mã của bạn để tránh làm sáng tỏ mã của bạn bằng những thứ không an toàn.

Bạn cũng có thể sử dụng một STM (IO a) nhưng điều này không phải lúc nào cũng phù hợp với mục đích của bạn, giống như

do r <- atomically $ do ... 
    r' <- r 

hoặc

do r <- join . atomically $ do ... 

đâu bạn quay lại truy vấn cơ sở dữ liệu để thực hiện từ STM . Điều này là an toàn nhưng nhiều hạn chế hơn như những gì bạn làm với mVar và như vậy không thể được sửa đổi từ bên trong hành động IO bạn quay trở lại (đó là một điều tốt liên quan đến an toàn vì nó giữ nguyên tử)

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