SQL Server - таблица, кажется, заблокирована - PullRequest
2 голосов
/ 26 июля 2010

Я попытался сохранить график объектов, используя NHibernate.Не удалось сохранить файл из-за нарушения ненулевого ограничения.

Теперь я обнаружил, что таблица в базе данных, соответствующая одному из объектов на графике, теперь выглядит заблокированной.Я не могу запросить это.Всякий раз, когда я пытаюсь, он просто сидит и ничего не делает, пока я не отменю запрос.Так было около получаса.

В коде сохранения транзакция сначала фиксируется, а затем удаляется.

SELECT @@ TRANCOUNT для базы данных дает 0.

Любые идеи а) Что происходит и б) Как мне вернуть стол?

Ответы [ 5 ]

3 голосов
/ 26 июля 2010

@@TRANCOUNT относится к текущему соединению .

Предполагается, что у вас есть достаточные разрешения на сервере.

select hostname,program_name, spid,text  from master.sys.sysprocesses 
outer apply sys.dm_exec_sql_text(sql_handle) s
WHERE open_tran>0

дает любые соединения с текущими открытыми транзакциями вместе с последним текстом, выполненным этим соединением. Я использую sysprocesses по причинам здесь .

Если в приведенном выше запросе указан ваш преступник, вы можете получить spid и использовать kill <spidnumber> для его бесцеремонного отката. Возможно, вы захотите включить XACT_ABORT для будущих запросов, чтобы ошибки не оставлялись открытые транзакции.

0 голосов
/ 26 июля 2010

Независимо от каких-либо других специфических действий с БД, вы должны откатить транзакцию сразу после ошибки.Это не должно оставлять ничего запертым.

0 голосов
/ 26 июля 2010

попробуйте выполнить это:

SELECT
    r.session_id AS spid
        ,r.cpu_time,r.reads,r.writes,r.logical_reads 
        ,r.blocking_session_id AS BlockingSPID
        ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
        ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
        ,s.program_name
        ,s.login_name
        ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
        ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
                                                                  WHEN -1 THEN DATALENGTH(st.text)
                                                                  ELSE r.statement_end_offset
                                                              END - r.statement_start_offset
                                                             )/2
                                                           ) + 1
                  ) AS SQLText
    FROM sys.dm_exec_requests                          r
        JOIN sys.dm_exec_sessions                      s ON r.session_id = s.session_id
        CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
    WHERE r.session_id!=@@SPID

он скажет вам, кто блокирует ваш запрос

0 голосов
/ 26 июля 2010

Вы уверены, что правильно утилизировали сеанс?Это обычно является причиной таких проблем ...

0 голосов
/ 26 июля 2010

Если у вас есть доступ к базе данных, попробуйте запустить sp_lock, чтобы узнать, у кого заблокирована таблица.

Редактировать : при этом будут возвращены записи с несколькими описанными столбцами информации здесь .Один из этих столбцов - spid.Вы можете использовать sp_who (или sp_who2), чтобы увидеть, кто вошел в систему, и найти spid, удерживающий блокировку.

Если у вас есть разрешение «просматривать состояние сервера», вы также можете использоватьsys.dm_tran_locks.

...