Конференция "Базы" » Блокировка в SQL [MSSQL]
 
  • miau (08.09.11 12:23) [0]
    Уважаемые мастера, столкнулся с непонятной хренью, и не знаю, как её забарывать.

    Суть проблемы такая:
    Есть небольшая табличка, 7 столбцов, а число строк редко переваливает за 10. Когда пользователь открывает форму редактирования, туда вносится строка. Когда форма закрывается, строка удаляется.
    Всё хорошо работало, пока не перешли с SQL-2000 на SQL-2008. Потом началась полная хрень: где-то раз на три дня таблица блокируется так, что внести в неё запись можно, прочитать через (nolock) можно, а удалить или прочитать без флага (nolock) не выходит.
    Единственным выходом пока является стоп-старт сервера. Есть ли у кого-нибудь мысли, в чём может быть дело?
  • OW © (08.09.11 12:39) [1]
    ADOTable не юзать.
    в свойствах соединения внимательно с режимом

    определить кто блокирует
    select * from sys.sysprocesses
    where blocked <> 0

    потом, узнать его(их) sql-запрос
    dbcc inputbuffer(spid полученного на шаге 1)

    потом смотря что видим
  • miau (08.09.11 12:49) [2]

    > ADOTable не юзать

    Не юзаю. Только ADOQuery и ADOStoredProc.

    > в свойствах соединения внимательно с режимом

    А что там может быть не то, просветите ламера?

    > определить кто блокирует

    Спасибо, буду смотреть, как повесятся.
  • OW © (08.09.11 12:53) [3]

    > А что там может быть не то, просветите ламера?

    ну, это..
    { TADOConnection }

     TConnectMode = (cmUnknown, cmRead, cmWrite, cmReadWrite, cmShareDenyRead,
       cmShareDenyWrite, cmShareExclusive, cmShareDenyNone);

     TConnectOption = (coConnectUnspecified, coAsyncConnect);

     TCursorLocation = (clUseServer, clUseClient);

     TCursorType = (ctUnspecified, ctOpenForwardOnly, ctKeyset, ctDynamic,
       ctStatic);

    лишнего не просить, в смысле
  • Кщд (08.09.11 16:46) [4]
    >miau   (08.09.11 12:23)  
    commit ставьте
  • miau (08.09.11 16:57) [5]

    > commit ставьте


    Там нет транзакций, объявленных через BEGIN TRANSACTION.
  • Кщд (08.09.11 20:38) [6]
    >miau   (08.09.11 16:57) [5]
    вы данные внетранзакционно вставляете?
    научите?
    и, конечно, код не показывайте
  • SQLEX © (08.09.11 22:06) [7]
    commit явный нужен если в св-ах стоит не автоматическая транзакция, или она начата явно.
    иначе она и так начинается автоматически и автоматически завершается тоже.
  • Кщд (08.09.11 22:23) [8]
    >SQLEX ©   (08.09.11 22:06) [7]
    откуда блокировки?
    либо commit, либо непоказанный код, либо комбинация.
    лично я предлагаю ТС не читать про транзакции и рестартовать сервер из-за блокировок в таблице с десятью записями, ибо очевидно, что во всём виноват MS
  • OW © (09.09.11 08:34) [9]

    > Кщд   (08.09.11 22:23) [8]
    >
    > >SQLEX ©   (08.09.11 22:06) [7]
    > откуда блокировки?
    > либо commit, либо непоказанный код, либо комбинация.

    100%
    Но откуда уверенность, что именно этого приложения?
    Надо выяснить кто блокирует сначала
  • OW © (09.09.11 09:15) [10]

    > определить кто блокирует
    > select * from sys.sysprocesses
    > where blocked <> 0


    а потом можно
    kill spid_полученного_соединения и сидим ждем, кто позвонит с проблемой "я работала, а тут все перестало показываться почему-то "
    Отвечаем, что понятия не имеем почему же это так произошло и пытаем что было запущено и что при этом делалось. Потом звоним автору и говорим, что он балбес и при таких-то действиях такой-то программы таблица у него блокируется. И пусть разбирается сам :)

    Шутка.
  • Anatoly Podgoretsky © (09.09.11 09:20) [11]
    > OW  (09.09.2011 08:34:09)  [9]

    > Надо выяснить кто блокирует сначала

    А чего тут выяснять и так ясно кто.
  • miau (13.09.11 14:12) [12]
    Помогло уничтожение индексов на таблице.
  • DiamondShark © (13.09.11 14:47) [13]

    > miau   (13.09.11 14:12) [12]
    > Помогло уничтожение индексов на таблице.

    Таракан слышит ногами.
 
Конференция "Базы" » Блокировка в SQL [MSSQL]
Есть новые Нет новых   [134431   +11][b:0][p:0]