2010-07-08 21 views
12

Giả sử tôi đang làm một cái gì đó như thế này (từ Active Record Querying guide)khi nào là một khóa bi quan được phát hành trong đường ray?

Item.transaction do 
    i = Item.first(:lock => true) 
    i.name = 'Jones' 
    i.save 
end 

là khóa tự động phát hành vào cuối của giao dịch? Tôi đã xem hướng dẫn Truy vấn hoạt động và số ActiveRecord::Locking::Pessimistic docs và không thể tìm thấy nơi hiển thị rõ ràng vị trí khóa được giải phóng.

Trả lời

23

Khóa không phải là chức năng của đường ray, nó chỉ thêm câu lệnh khóa vào truy vấn, điều này sẽ khác nhau tùy thuộc vào cơ sở dữ liệu bạn đang sử dụng. Khóa bi quan có một cái nhìn "bi quan" khi nghĩ rằng mọi truy vấn đều bị tham nhũng. Vì vậy, nó sẽ khóa các hàng đã chọn cho đến khi bạn kết thúc với giao dịch . do đó, Khóa> truy vấn> mở khóa. Mặc dù đây là cơ sở dữ liệu khá nhất quán với cơ sở dữ liệu, nhưng bạn có thể đọc tốt trên tài liệu cơ sở dữ liệu mà bạn sử dụng cho bất kỳ điều gì cụ thể về cơ sở dữ liệu bạn nên biết.

Đây là một chủ đề tốt về khóa lạc quan và bi quan giải thích tốt hơn tôi có thể. Optimistic vs. Pessimistic locking

+1

Cảm ơn. Tôi đang sử dụng mySQL vì vậy tôi đã tìm kiếm nó trong các tài liệu đó và nó nói rằng khóa được phát hành khi giao dịch cam kết hoặc quay trở lại. Tôi không biết nó hoạt động như thế nào bên ngoài một giao dịch. – user26270

+1

"Khóa không phải là chức năng của đường ray" - Khóa lạc quan là, trong khi khóa bi quan dựa trên sự hỗ trợ mức thấp từ DB. – Felixyz

+0

Nó khóa toàn bộ cơ sở dữ liệu ??! – AjaxLeung

-2

Tôi tin rằng bạn sẽ muốn chặn "đảm bảo" chắc chắn rằng khóa được giải phóng.

http://ruby-doc.org/core/classes/Mutex.src/M000916.html có:

def synchronize 
    lock 
    begin 
     yield 
    ensure 
     unlock 
    end 
    end 

http://yehudakatz.com/2010/02/07/the-building-blocks-of-ruby/ dường như cho thấy, tuy nhiên, cấu trúc khối của phương pháp đó sẽ tự động mở khóa.

+2

Đây là loại sai của khóa, cơ sở dữ liệu bi quan khóa vs chủ đề khóa –

4

Có, khóa tự động được phát hành vào cuối giao dịch vì loại khóa này chỉ áp dụng cho các giao dịch. Nó không có ý nghĩa để khóa hồ sơ theo cách này (khóa bi quan) bên ngoài giao dịch.

Khóa bi quan được thực thi ở cấp DB.

Dưới đây là một mô tả với các ví dụ cho mysql: http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html

+1

Đó là chính xác, nó không phải là kết thúc của truy vấn, nhưng kết thúc của * giao dịch *. Tôi đã cố định câu trả lời cho sự nhầm lẫn trước. – lzap

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