Как проверить, какие замки удерживаются на столе

Вы имеете в виду проверенные исключения , то есть они должны быть объявлены или обработаны. Стандартная конструкция для работы с файлами в Java выглядит примерно так:

InputStream in = null;
try {
  in = new InputStream(...);
  // do stuff
} catch (IOException e) {
  // do whatever
} finally {
  if (in != null) {
    try {
      in.close();
    } catch (Exception e) {
    }
  }
}

Является ли это уродливым? Конечно. Это многословный? Конечно. Java 7 сделает его немного лучше с блоками ARM, но до тех пор вы застряли с указанным выше.

Вы также можете разрешить обработчику исключений:

public void doStuff() throws IOException {
  InputStream in = new InputStream(...);
  // do stuff
  in.close();
}

, хотя даже то close() следует, вероятно, обернуть в блок finally.

Но указанное выше объявление функции говорит, что этот метод может выдать IOException. Поскольку это проверенное исключение, вызывающей стороне этой функции потребуется catch это (или объявить ее так, чтобы ее вызывающий мог справиться с ней и т. Д.).

143
задан Somnath Muluk 4 August 2016 в 10:28
поделиться

4 ответа

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

Существует несколько различных версий "более дружественных" sp_lock процедуры, доступные онлайн, в зависимости от версии рассматриваемого SQL Server.

В Вашем случае, для SQL Server 2005, sp_lock все еще доступно, но удержанный от использования, таким образом, теперь рекомендуется использовать sys.dm_tran_locks представление для такого рода вещи. Можно найти пример как к "самокрутке" sp_lock функция здесь.

115
ответ дан 23 November 2019 в 22:34
поделиться

Можно также использовать встроенное sp_who2 хранимая процедура для получения текущих заблокированных и блокирующихся процессов на экземпляре SQL Server. Обычно Вы выполнили это вместе с экземпляром SQL Profiler, чтобы найти, что блокирование обрабатывает и смотрит на новую команду что spid, выпущенный в профилировщике.

16
ответ дан 23 November 2019 в 22:34
поделиться

Это точно не показывает Вам, какие строки заблокированы, но это может полезный Вам.

Можно проверить, какие операторы заблокированы путем выполнения этого:

select cmd,* from sys.sysprocesses
where blocked > 0

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

Редактирование для добавления комментария от @MikeBlandford:

Заблокированный столбец указывает на spid процесса блокирования. Можно работать, уничтожают {spid} для фиксации его.

107
ответ дан 23 November 2019 в 22:34
поделиться

Я использую динамическое представление управления (DMV) для захвата блокировок, а также object_id или partition_id элемента, который заблокирован .

(ДОЛЖЕН переключиться на базу данных, за которой вы хотите наблюдать, чтобы получить object_id)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;
35
ответ дан 23 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: