SQL временная таблица уже существует, хотя я проверил ее с помощью OBJECT_ID ('tempdb .. ## myTable') IS NULL - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно использовать существующие глобальные временные таблицы или создать их и заполнить, если они не существуют.

Пример одной таблицы

BEGIN TRANSACTION
if OBJECT_ID('tempdb..##myTable') IS NULL
begin
    create table ##myTable (
        --stuff
    )
end
COMMIT TRANSACTION
BEGIN TRANSACTION
if (select count(*) from ##myTable) = 0
begin
    insert into ##myTable
    --select stuff
end
COMMIT TRANSACTION

Иногда это работает, а иногда ошибка "Таблица ## myTable уже существует "показывает. Я единственный, кто использует эти глобальные временные таблицы

1 Ответ

0 голосов
/ 27 мая 2020

Это классическое c состояние гонки. Несколько сеансов могут выполнять запрос if OBJECT_ID('tempdb..##myTable') IS NULL одновременно. Если таблица не существует, обе попытаются создать таблицу, и только одна из них будет успешной.

Один из способов решения проблемы - использовать блокировку приложения для сериализации блока кода среди несколько сеансов. Например:

SET XACT_ABORT ON; --best practice with explict T-SQL transactions
BEGIN TRANSACTION;
EXEC sp_getapplock 
      @Resource = 'create ##myTable'  
     ,@LockMode = 'Exclusive'   
     ,@LockOwner = 'Transaction';
if OBJECT_ID('tempdb..##myTable') IS NULL
begin
    create table ##myTable (
        --select stuff
    );
end;
COMMIT TRANSACTION; --also releases app lock
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...