2009-11-30 30 views
7

Tôi có một bảng mnesia với ba lĩnh vực, i, a, b, tạo bằng kỷ lụcErlang: Mnesia: Cập nhật một giá trị trường duy nhất trong một hàng

-record(rec, {i, a,b}). 

Bây giờ tôi chèn một hàng vào bảng như :

mnesia:transaction(fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end). 

Bây giờ tôi phải làm gì nếu tôi muốn cập nhật hàng này và chỉ thay đổi giá trị từ 10 thành, trong khi để i và b có cùng giá trị? Có bất kỳ tương đương SQL nào như "UPDATE T SET a=10 WHERE i=1" không?

Nếu tôi làm điều gì đó như thế này:

mnesia:transaction(fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end) 

Hàng được lưu giữ như:

{rec,1,10,undefined} 

Trả lời

9

Giá trị của chức năng này sẽ cập nhật một nếu sử dụng trong một mnesia: giao dịch

update_a(Tab, Key, Value) -> 
    fun() -> 
    [P] = mnesia:wread({Tab, Key}), 
    mnesia:write(P#pixel{a=Value}) 
    end. 

Góp ý: có một peek tại QLC nếu bạn muốn có một số đường cú pháp đó là giống như cú pháp SQL.

Hiệu suất là khóa học được đánh giá tốt nhất, nhưng QLC có phí, tôi không chắc chắn rằng chúng có liên quan so với các chi tiết khác. Tôi chỉ thấy rằng ví dụ SQL bạn đã cung cấp sẽ cập nhật tất cả các bản ghi có i=1. Sử dụng QLC để trích xuất tập hợp các bản ghi đó là đẹp hơn các cuộc gọi mnesia.

Ngoài ra để thông báo, wread yêu cầu ghi trực tiếp vào bản ghi vì chúng tôi biết trước thời gian chúng tôi sẽ cập nhật bản ghi đó. Đó là một tối ưu hóa vi mô để tránh đầu tiên một khóa đọc, sau đó thay đổi tâm trí của chúng tôi và nhận được một khóa viết. Tôi đã không điểm chuẩn rằng trong một thời gian dài mặc dù.

Nếu hiệu suất vẫn là một vấn đề bạn nên xem xét các cách tiếp cận khác nhau nơi bạn sử dụng các hoạt động bẩn. Nhưng bạn thực sự nên cố gắng tìm ra số lượng giao dịch mỗi giây bạn cần, để đủ nhanh.

+0

Tôi cần phải có một mắt về hiệu quả, vì vậy bạn sẽ khuyên bạn nên sử dụng QLC hoặc phương pháp bạn đã chỉ định ở trên? – ErJab

+0

Tôi đã thử điều này, và vì một lý do nào đó nó không hoạt động. Giá trị không được cập nhật. – ErJab

+0

@ErJab, hãy kiểm tra dirty_update_counter, nó có thể phục vụ nhu cầu của bạn. – Zed

2

Tôi tin rằng bạn cần phải đọc "hàng", cập nhật bất cứ lĩnh vực bạn cần, và sau đó viết lại kết quả tất cả các hoạt động này trong một "giao dịch".

+0

Vâng tôi cũng nghĩ về điều đó, nhưng đây không phải là một hoạt động đắt tiền sao? – ErJab

+0

Cơ sở dữ liệu thông thường sẽ thực hiện các thao tác "CẬP NHẬT" trong giao dịch anyways hoặc cách nào khác để đảm bảo tính chính xác? Trong 'mnesia' tôi đoán người ta cần phải rõ ràng hơn, vì lý do nào đó mà tôi đã trốn thoát vào lúc này. – jldupont

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