Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Nolock ставит page lock  [new]
alter87
Member

Откуда:
Сообщений: 4
Доброго времени суток,

Помогите разобраться с локинг проблемой.
Есть большая бд, есть проблемы с page локами, которые вызывает select with nolock.

Пример:

<blocked-process-report>
  <blocked-process>
    <process id="process4c29288" taskpriority="0" logused="0" waitresource="PAGE: 5:3:1724112" waittime="23274" ownerId="1967629218" transactionname="COND WITH QUERY" lasttranstarted="2014-01-24T05:09:43.790" XDES="0x422be2e00" lockMode="S" schedulerid="5" kpid="29064" status="suspended" spid="94" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2014-01-24T05:09:43.790" lastbatchcompleted="2014-01-24T05:09:43.790" clientapp=".Net SqlClient Data Provider" hostname="test-host" hostpid="3292" loginname="testuser" isolationlevel="read committed (2)" xactid="1967629218" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
      <executionStack>
        <frame line="5" stmtstart="264" stmtend="474" sqlhandle="0x0300050021a08b5ead6d1200cfa000000100000000000000" />
      </executionStack>
      <inputbuf>
Proc [Database Id = 5 Object Id = 1586208801]   </inputbuf>
    </process>
  </blocked-process>
  <blocking-process>
    <process status="sleeping" spid="146" sbid="0" ecid="0" priority="0" trancount="1" lastbatchstarted="2014-01-24T05:09:41.357" lastbatchcompleted="2014-01-24T05:09:41.357" lastattention="2014-01-24T05:09:41.353" clientapp="Internet Information Services" hostname="test-host" hostpid="9740" loginname="testuser" isolationlevel="read committed (2)" xactid="1967628674" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
      <executionStack />
      <inputbuf>
select name from customer (NOLOCK) where customer_id = 111111   </inputbuf>
    </process>
  </blocking-process>
</blocked-process-report>


Блокирующий процесс делает select по кластерному индексу. Блокируемый процесс - хранимка, где судя по репорту блокируется select из другой таблицы.
Как shared lock с nolock хинтом может блочить селект из другой таблицы, еще и такое долгое время? Какой есть способ обойти эту проблему?

Спасибо

Сообщение было отредактировано: 19 фев 14, 19:58
19 фев 14, 19:42    [15593105]     Ответить | Цитировать Сообщить модератору
 Re: Nolock ставит page lock  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Customer - это не вьюха, случаем?
19 фев 14, 19:58    [15593237]     Ответить | Цитировать Сообщить модератору
 Re: Nolock ставит page lock  [new]
alter87
Member

Откуда:
Сообщений: 4
Гавриленко Сергей Алексеевич,

Нет, это таблица.
19 фев 14, 20:00    [15593252]     Ответить | Цитировать Сообщить модератору
 Re: Nolock ставит page lock  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Выясняйте почему в блокирующем процессе висит открытая транзакция и что в этой транзакции происходит до выполнения "select with nolock".
19 фев 14, 20:13    [15593350]     Ответить | Цитировать Сообщить модератору
 Re: Nolock ставит page lock  [new]
alter87
Member

Откуда:
Сообщений: 4
invm,

Искал по коду где встречаестя такой запрос, нашел только asp classic где это query выполняется и делается conn.close(). Никаких инструкций до или после в этом коннекшене нет. Скорее всего процесс sleeping из-за connection pooling, которое выключать скорее всего не вариант.

Сам по себе nolock хинт не должен ставить PAGE лок, верно я понимаю?
19 фев 14, 20:26    [15593448]     Ответить | Цитировать Сообщить модератору
 Re: Nolock ставит page lock  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
alter87
Скорее всего процесс sleeping из-за connection pooling, которое выключать скорее всего не вариант.
У вас там не просто sleeping, а sleeping с открытой транзакцией. Либо транзакция была открыта явно, либо неявно, если для соединения выставлено implicit_transactions on.
Ну и sleeping говорит, что нет выполняющихся запросов. А это значит, что даже если запрос с nolock ставил бы какие-нибудь S-блокировки, то по окончании его выполнение их бы уже не было, т.к. TIL там read committed.
alter87
Сам по себе nolock хинт не должен ставить PAGE лок, верно я понимаю?
Запрос с nolock не накладывает блокировок на данные.

Для начала выясните к какой таблице относится блокируемая страница.
19 фев 14, 21:15    [15593770]     Ответить | Цитировать Сообщить модератору
 Re: Nolock ставит page lock  [new]
alter87
Member

Откуда:
Сообщений: 4
invm,

Спасибо Вам, буду разбираться дальше.
20 фев 14, 15:49    [15599172]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить