Существуют недостатки использования подсчета ссылок. Один из наиболее упомянутых является циклическими ссылками: Предположим ссылки B, B ссылки C и ссылки C B. Если A должны были отбросить его ссылку на B, и B и C будут все еще иметь подсчет ссылок 1 и не будут удалены с традиционным подсчетом ссылок. CPython (подсчет ссылок не является частью самого Python, но частью реализации C этого) ловит циклические ссылки с отдельной стандартной программой сборки "мусора", которую это периодически выполняет...
Другой недостаток: Подсчет ссылок может сделать выполнение медленнее. Каждый раз, когда на объект ссылаются и разыменовывают, interpreter/VM должен проверить, чтобы видеть, снизилось ли количество 0 (и затем освободите, если это сделало). Сборка "мусора" не должна делать этого.
кроме того, Сборка "мусора" может быть сделана в отдельном потоке (хотя это может быть немного хитро). На машинах с большим количеством RAM и для процессов, которые используют память только медленно, Вы не могли бы хотеть делать GC вообще! Подсчет ссылок был бы определенным недостатком там с точки зрения производительности...
Вероятно, блокируется не выбранный процесс, а какой-то другой процесс, который редактирует (udpate / delete / insert) таблицу, которая вызывает блокировки.
Вы можете увидеть, какой процесс блокируется, запустив exec sp_who2
на вашем SQL Server.
В качестве альтернативы, если вас устраивает грязное чтение, вы можете сделать одно из двух
SELECT * FROM Table WITH (NOLOCK)
ИЛИ
SET Transaction Isolation Level Read Uncommitted
SELECT * FROM Table
Если есть ' Поскольку происходит много других действий, что-то еще может вызывать блокировки, и ваш SELECT может быть жертвой тупика. если вы запустите следующий
SELECT * FROM my_table WITH(nolock)
, вы сообщаете базе данных, что можете читать грязные (незавершенные) данные, и что блокировки, вызванные другими действиями, можно безопасно игнорировать.
Кроме того, если такой запрос вызывает Management studio, чтобы повесить, ваш стол может потребовать некоторой оптимизации
Используйте это:
SELECT * FROM MY_TABLE with (NOLOCK)
Два возможности:
MY_TABLE
также может быть заблокирован какой-либо незафиксированной транзакцией, т. Е. Скриптом / хранимой процедурой, запущенным (или неудачным во время выполнения) в другом окне MSMM.