|
06.07.2006, 11:41 | #1 |
Участник
|
Блокировка ключа индекса
Столкнулся со следующей проблемой: выбираю для обновления строку из таблицы WMSShipment (таблица отгрузок) по полю ShipmentId (номер отгрузки). При этом, поскольку по полю ShipmentId стоит индекс, происходит блокировка на обновление ключа индекса со значением этой строки. Это все нормально и понятно - надо запретить другим пользователям выбирать эту строку на обновление. Но в таблице отгрузок еще есть индекс по полю статус, и значение ключа этого индекса тоже блокируется!!! Но статус - это ведь не уникальный индекс - в этой таблице всего несколько разных статусов, и это значит что теперь огромная часть таблицы будет заблокирована. К примеру если мы выберем всего 1 строку со статусом Активизировано, будут заблокированы все строки с таким статусом!!! Кто нибудь сталкивался уже с этим? Кто нибудь может сказать на какие именно индексы в SQL SERVER
накладывается блокировка обновления если у таблицы несколько индексов? Работаем в Аксапте, Kernel Rollup 1, SQL Server 2005, подозреваю что 2000-й sql работает с блокировками на обновление так же |
|
06.07.2006, 12:38 | #2 |
Участник
|
в 2005-м сделали блокировку по строке? в 2000 по блокам. Блокируется блок целиком со всеми смежными значениями индекса, попавшими в этот блок. Это нормально Может дело не в статусе?
С уважением, itfs. |
|
06.07.2006, 15:54 | #3 |
Участник
|
Протестировал на 2000-м SQL - и понял что ошибался - 2000-й таких блокировок на обновление не делает. В 2000-м блокируется только 1 индекс - тот по которому делается запрос на обновление
|
|
06.07.2006, 15:54 | #4 |
Участник
|
2 itfs:
Насчет блока и смежных значений не понял. Вот есть например табличка WMSShipment, в ней поле shipmentId по которому построен индекс. теперь если я сделаю select forupdate wmsShipment where wmsShipment=='00000001' то на значение ключа индекса '00000001' поставится блокировка обновления, и если другие пользователи попытаются сделать то же самое - их поток будет ждать пока не снимется эта блокировка. Это правильно - поскольку нельзя дать 2-м пользователям одновременно обновлять одну запись. Но проблема в том, что в приведенном выше примере у меня заблокируется еще и значение ключа индекса по полю Status. Т.Е. если в данной строке стоит статус "Активизировано", значение ключа "Активизировано" будет блокироваться. И когда другой пользователь будет выбирать другую строку этой таблицы, где поле статус тоже имеет значение "Активизировано", его процесс тоже захочет заблокировать значение ключа индекса, и не сможет этого сделать до тех пор пока его не разблокирует первый процесс. Что касается блокирования блока целиком со смежными значениями индекса - единственное похожее что я знаю - блокировка диапазона значений индекса, но она применяется только с уровня изоляции транзакций Repeatable Read, т.е. в аксапте никогда не используется |
|
06.07.2006, 16:08 | #5 |
Модератор
|
Sequel - просто приведите DML, план исполнения (опционально) и результаты sp_lock на обеих версиях
__________________
-ТСЯ или -ТЬСЯ ? |
|