В базе данных нам не хотелось бы, чтобы таблица была удалена во время изменения строки в этой таблице. По моему пониманию, блокировка чтения на таблице + блокировка записи в строке при записи строки в таблице должна быть достаточной (на основании того, что при удалении таблицы требуется блокировка записи), зачем в этом случае нужна блокировка намерений? кажется, много баз данных, использующих блокировку намерений, которые меня очень смутили. Я думаю, что pthread_rwlock должно быть достаточно.Зачем нам нужно блокирование намерений?
ответ
блокировки чтения на столе + блокировка записи по строке
Это нарушило бы смысл read lock
на столе.
Предполагает одновременную операцию SELECT, которая ожидает немодифицированная таблица во время исполнения. Эта операция займет читать блокировку на столе ... и он будет преуспеть в вашей реализации. Это плохо, так как таблица фактически модифицирована во время изменения строки.
Вместо этого следуют комбинации замков используется для дорабатывают строки в таблице:
IX(Intent eXclusive) on table + X(eXclusive, similar to "write lock") on row
Эта комбинация совместима (то есть, может быть выполнена параллельно) с модификацией другого ряда, но это несовместима с
S(Share, similar to "read lock") on table
используется SELECT.
Таблица совместимости замков может быть найдена, например, на wiki.
Я прочитал here, что они существуют только для исполнения. Представьте, что вы хотите отказаться от таблицы, но вам придется проверять каждую строку, если она заблокирована или нет - это потребует много времени, и вам придется заблокировать каждую проверенную вами строку.
Heres цитата из блога:
С технической точки зрения Намерение замки не очень необходимой SQL Server. Они связаны с оптимизацией производительности. Давайте посмотрим на это более подробно. С помощью Intent Lock SQL Server только указывает на более высоком уровне в иерархии блокировки, которую у вас есть , и приобрел замок где-то в другом месте. Intent Shared Lock сообщает SQL Server , что в другом месте есть общий замок. Интенсивное обновление или намерение Исключительная блокировка делает то же самое, но на этот раз SQL Server знает, что есть блокировка обновления или эксклюзивный замок где-то. Это всего лишь показатель , не более того.
Но как это указание помогает SQL Server с производительностью ? Представьте, что вы хотите приобрести эксклюзивный замок на уровне стола . В этом случае SQL Server должен знать, есть ли в записи несовместимый замок (например, Shared или Update Lock) в записи . Без блокировок Intent SQL Server должен будет проверить каждую запись , чтобы узнать, предоставлен ли несовместимый замок.
Но с Intent разделяемой блокировкой на уровне таблицы, SQL Server знает сразу, что разделяемая блокировка была предоставлена где-то еще, и поэтому монопольная блокировка не может быть предоставлена на уровне таблицы. В этом вся причина, по которой Intent Locks существуют в SQL Server: разрешить эффективную проверку, существует ли какая-либо несовместимая блокировка в пределах Иерархия блокировки. Довольно легко, не так ли?
- 1. Зачем нам нужно remove_copy_if?
- 2. Зачем нам нужно targetNamespace?
- 3. Зачем нам нужно устанавливать SONAR_RUNNER_OPTS?
- 4. Зачем нам нужно использовать package.json?
- 5. Зачем нам нужно «Set Variable»?
- 6. Зачем нам нужно Явное преобразование
- 7. Зачем нам нужно использовать flatMap?
- 8. Зачем нам нужно преобразовать Теано?
- 9. Зачем нам нужно создавать макет?
- 10. Зачем нам нужно программирование RPC?
- 11. материализованный вид - зачем нам это нужно?
- 12. Зачем нам нужно разрешение на RBAC?
- 13. Зачем нам нужно перенаправить имя источника?
- 14. Зачем нам нужно дважды дублировать коллекцию Lua?
- 15. Зачем нам нужно блокировать() перед wait()?
- 16. Зачем нам нужно свойство в Python?
- 17. Зачем нам нужно указывать метод init?
- 18. Зачем нам нужно установить адрес публикации [network.host]
- 19. Зачем нам нужно изменять количество файлов i_generation?
- 20. Зачем нам нужно проверять хэш-код дважды?
- 21. Зачем нам нужно создавать таблицу векторов прерываний?
- 22. Шаблон адаптера: зачем нам нужно подклассировать Adaptee?
- 23. Зачем нам нужно устанавливать модули python
- 24. Зачем нам нужно вызвать poll_wait в опросе?
- 25. Зачем нам нужно исключать из pom
- 26. Что означает делегат? Зачем нам это нужно?
- 27. Что делает tf.app.flags? зачем нам это нужно?
- 28. Что такое OWASP? зачем нам это нужно?
- 29. Зачем нам нужно создавать службу для Android
- 30. Зачем нам нужно устанавливать virtualenv и virtualenvwrapper
Большое спасибо за ваш ответ, @ Цыварев. Есть ли у вас фрагмент кода, показывающий, как реализовать блокировку намерений? Что касается простой блокировки чтения/записи, то это pthread_rwlock_xxx. есть ли у нас некоторые утилиты в Linux для блокировки намерений? также, когда блокировка намерения лучше, чем RWLock. Из-за какой-то более дешевой операции, лучшей детализации? – zhihuifan
Извините, но я не знаю, как реализованы блокировки намерений. Как я знаю, базы данных являются основными пользователями этой функциональности. Очень важно иметь гранулярность в больших таблицах. – Tsyvarev