2016-11-04 3 views
0

Так что скажем, что у меня есть несколько процессов в моем приложении rails, которые могут получить доступ к БД. Теперь в одном из процессов я хочу запросить таблицу и сразу последовать, чтобы запросить ее снова. Мой вопрос в том, как я могу убедиться, что никакие изменения не были внесены в таблицу другими процессами между двумя запросами, сделанными одним и тем же процессом? Будет ли здесь помощь? Я так не думаю.Как предотвратить любые изменения в таблице между двумя различными запросами

+0

'Транзакция действует на одно соединение с базой данных. Если у вас несколько баз данных, специфичных для класса, транзакция не будет защищать взаимодействие между ними. Одним из способов является начало транзакции для каждого класса, чьи модели вы изменяете: ' –

+0

Какое поведение вы хотите, если другой сеанс пытается изменить данные между этими двумя запросами? Выбросить ошибку? Или вы просто хотите узнать, изменились ли данные, чтобы вы могли повторно запросить его и повторить попытку? –

ответ

0

У вас есть несколько вариантов. Я не знаю много о архитектуре вашего приложения или о том, какую базу данных вы используете. В зависимости от используемой базы данных (mysql, pgsql и т. Д.) Вы можете сделать table locking. Подробная информация о том, как эта работа отличается от базы данных DB к DB. Помимо блокировки таблицы вы можете использовать какую-то систему очередей (lick active job, или delayed job), которая будет помещать в очередь все записи в эту таблицу и только обрабатывает записи в эту таблицу после завершения текущей записи. Это реальный высокий уровень объяснения и есть некоторые соображения, которые нужно принимать во внимание, такие как:

  • будет задерживать эти операции записи вызывают
    • ли пользователь или система ожидать, что эти записи, чтобы быть в реальном масштабе времени в race condition
    • у вас есть ресурсы, чтобы интегрировать системы массового обслуживания
    • Итак, это ли текущее предложение таблицы базы данных блокировки

    некоторые отправная точка для исследов rch Я скажу, что если вы просто прекратите редактирование таблицы, вам придется убедиться, что вы сохраните все записи, которые произошли бы белые, таблица находится в заблокированном состоянии.