2014-09-04 3 views
1

Вслед за https://stackoverflow.com/a/16553083/14731 ...Могут ли строки только для чтения запускать блокировки базы данных?

Я понимаю, что это очень важно для поддержания состоящий фиксируя порядок таблиц для того, чтобы уменьшить частоту зависаний, и что это влияет как UPDATE и SELECT заявления [1]. Но, делает то же самое, что и для строк только для чтения?

Если строка была заполнена один раз во время инициализации, и никто ее еще не модифицирует, действительно ли имеет значение, к какому приказу мы обращаемся к ней?

Учитывая две операции: T1, T2 и два только для чтения, строки R1, R2

T1 читает R1, тогда R2 Т2 считывает R2, тогда R1

Может сделки взаимоблокировки, даже если я использую Серийная изоляция транзакций?

[1] Если изоляция транзакции равна REPEATABLE_READ, T1 SELECT s R1, R2, а T2 UPDATE s R2, R1 может возникнуть взаимоблокировка.

ЗАЯВЛЕНИЕ: Этот вопрос не является специфичным для РСУБД. У меня создается впечатление, что никакая реализация не может блокировать строки только для чтения. Если у вас есть встречный пример (для конкретного поставщика), отправьте ответ, демонстрирующий столько же, и я его приму. Кроме того, опубликовать список всех конкретных реализаций, которые вы можете доказать, не будет заторможенным (и самый полный список будет принят).

+1

Какой тип РСУБД вы используете? Пожалуйста, отметьте свой вопрос. У каждого поставщика могут быть детали реализации, которые влияют на ответ. –

+0

@BillKarwin, у меня сложилось впечатление, что ответ будет охватывать все реализации. Если у вас есть конкретный пример заявления о том, что тупики на одном поставщике, но не на другом, отправьте ответ, демонстрирующий столько же, и я его приму. – Gili

+1

Ну, например, MySQL InnoDB не блокирует чтение, поэтому взаимоблокировки не произойдет, кроме нескольких авторов. Вероятно, это относится к любой реализации, использующей архитектуру MVCC. –

ответ

0

Этот вопрос невозможно ответить для всех возможных РСУБД, поскольку стратегия блокировки является деталью реализации. Это сказали, полезные РСУБД будут некоторые общие характеристики:

Для SELECT заявления без намеков прикладных (FOR UPDATE, WITH (UPDLOCK) ...) любая разумная RDBMS не будет принимать писать замки. Это могут быть блокировки чтения. Действительно, по крайней мере SQL Server делает это для SERIALIZABLE, за исключением таблиц Hekaton.

Read-locks никогда не конфликтуют. Без взаимоблокировки, если выполняются только чтения.

Строки, доступные только для чтения, могут, однако, создавать взаимоблокировки, даже если они никогда не записываются. В SQL Server

UPDATE T SET SomeCol = 1 WHERE ID = 10 AND SomeCol = 0 

примет U-блокировку на строку с идентификатором 10. Если SomeCol не 0 блокировка будет немедленно освобожден, и ничего не будет записано. Но U-lock - это тип блокировки, который может конфликтовать и привести к тупиковой ситуации. Если бы строка с ID 10 не присутствовала, тупик был бы возможен.

+0

Где строка только для чтения в примере 'UPDATE T SET SomeCol = 1 WHERE ID = 10 AND SomeCol = 0'? Я предполагаю, что строка, соответствующая предложению 'WHERE', не доступна только для чтения, потому что вы ее обновляете. – Gili

+0

@Gili, потому что ГДЕ не соответствует ему, никогда не записывается. Если бы была строка с идентификатором ID = 11, вы бы не сказали, что эта строка также обновляется. В этом отношении строка с идентификатором ID = 11 и строкой с идентификатором ID = 10 и FALSE эквивалентна. Не обновляется. – usr

+0

Итак, вы говорите, что несоответствующие строки временно получат блокировку записи, но блокировка будет удалена, как только база данных заметит, что они не совпадают. Верный? Я не думаю, что такое поведение может вызвать тупик, потому что типичные таймауты блокировки подсчитываются в секундах ([50 секунд для MySQL] (http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html #sysvar_innodb_lock_wait_timeout) и [1 секунда для Postgres] (http://www.postgresql.org/docs/9.1/static/runtime-config-locks.html), тогда как блокировки обычно приобретаются и освобождаются менее чем за 5 мс. – Gili

Смежные вопросы