2013-02-21 6 views
1

Я хочу знать, если параметр lock, переданный в запрос, фактически заблокирует запись и избежит параллельного чтения.Ruby on Rails Locking Sqlite Database

Ex: Query.where(:id => 1, :lock => true)

ли это гарантия того, что никто не будет читать эту запись, пока не снять блокировку?

ответ

0

Понятие locking относится к продукции update, а не read. Когда запись заблокирована, обычно можно просмотреть запись; более важный вопрос: может ли кто-нибудь обновить запись, когда она заблокирована.

Синтаксис, о котором вы упомянули, будет искать поле по имени lock в таблице.

Для pessimistic locking with rails, синтаксис выглядит следующим образом:

Query.where(:id => 1).lock(true) 

Как объяснен в рельсах направляющих документаций я связана выше:

Пессимистическая блокировка использует механизм блокировки предоставленного основной базы данных.

Поэтому рекомендуется ознакомиться с документацией по базе данных, чтобы узнать, какой механизм блокировки предоставляется этой базой данных.

Играя с функцией блокировки в нескольких сеансах rails console, я смог обновить запись из одного окна, в то время как одна и та же запись была заблокирована из другого окна.

Так что это не похоже на то, что моя версия базы данных sqlite не поддерживает блокировку.

+1

Не забывайте, что блокировки освобождаются в конце текущей транзакции (т. Е. В конце инструкции, если нет явной транзакции). Пессимистический замок должен помешать дальнейшему чтению –