Указывает ли стандарт SQL порядок блокировки для запроса с несколькими таблицами?Что определяет порядок блокировки для запроса с несколькими таблицами?
Например, если:
SELECT department.id FROM permissions, terminals, departments WHERE department.id = ? AND terminal.id = ? AND permissions.parent = department.id AND permissions.child = terminals.id;
- Гарантирует ли стандарт SQL заказ запирающий или она определяется (реализации конкретного плана выполнения)?
- Есть ли способ гарантировать порядок блокировки?
- Если нет способа гарантировать порядок блокировки, как мы должны предотвращать взаимоблокировки?
UPDATE: Пожалуйста, не голосуйте, чтобы закрыть этот вопрос, не объясняя ваши рассуждения. Насколько мне известно, это вопрос программирования, который делает его очень актуальным для Stackoverflow. Если вы считаете, что вопрос нуждается в дальнейшем уточнении, объясните, и я буду более чем счастлив ответить вам.
Запросы SELECT не генерируют блокировки, которые приводят к взаимоблокировкам. Можете ли вы перефразировать свой вопрос, чтобы он соответствовал реальной ситуации? –
@GordonLinoff, SELECT запросы в READ_COMMITTED создают генерации блокировок (но на время выполнения инструкции). Для других уровней изоляции (например, REPEATABLE_READ или SERIALIZABLE) они сохраняют блокировку до конца транзакции. Предостережение: в некоторых базах данных используется MVCC, который не использует блокировки, но они не подходят для этого вопроса. – Gili
Замки - это деталь реализации. Уровни изоляции просто определяют явления, которые могут/не встречаться. В SQL Server выбор запросов при чтении выполняется в основном с помощью блокировки 'S', которые освобождаются, как только данные считываются (до конца инструкции). Иногда эти блокировки могут храниться до тех пор, пока утверждение не завершится [пример] (http://blogs.msdn.com/b/craigfr/archive/2007/05/31/read-committed-and-large-objects.aspx) и в других случаях он не принимает блокировки на уровне строки 'S'. При заданной точке 1 точки 2 и 3 являются неопровержимыми, если вы не укажете определенную СУБД. –