Изоляция снимков TSQL - PullRequest
       15

Изоляция снимков TSQL

1 голос
/ 05 января 2010

Используя SQL2k5, у меня есть промежуточная таблица, которая содержит столбцы, которые будут заполнять множество других таблиц. Например, утверждение, подобное этому:

 INSERT INTO [appTable1] ([colA], [colB])
 SELECT [appTable1_colA], [appTable1_colB]
 FROM [stageTable]

Триггер на [appTable1] затем заполняет значения столбца идентификации вновь вставленных строк обратно в [stageTable]; для этого примера мы скажем, что это [stageTable]. [appTable1_ID], которые затем вставляются в другие таблицы как FK. Более похожие утверждения следуют как:

 INSERT INTO [appTable2] ([colA], [colB], [colC], [appTable1_FK])
 SELECT [appTable2_colA], [appTable2_colB], [appTable2_colC], [appTable1_ID]
 FROM [stageTable]

Этот процесс продолжается через многочисленные таблицы, подобные этой. Как вы можете видеть, я не включаю предложение WHERE в SELECT из промежуточной таблицы, так как эта таблица усекается в конце процесса. Однако это оставляет возможность для другого процесса добавлять записи в эту промежуточную таблицу в середине этой транзакции, и эти записи не будут содержать ранее заполненные FK. Хотел бы я выдать это заявление, чтобы предотвратить это?

 SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Если это лучшее решение, каковы его недостатки?

Ответы [ 2 ]

1 голос
/ 05 января 2010

Можете ли вы добавить идентификатор партии в промежуточную таблицу, чтобы использовать его в предложениях where, чтобы гарантировать, что вы работаете только с исходным пакетом записей? Любой процесс, который добавляет записи в промежуточную таблицу, должен будет использовать новый уникальный идентификатор пакета. Я думаю, это будет более эффективным (и более надежным), чем в зависимости от изоляции моментальных снимков.

1 голос
/ 05 января 2010

Все уровни изоляции, включая снимок, влияют только на чтение. SELECTs из stageTable не будут видеть незафиксированные вставки и не будут блокировать. Я не уверен, что это решает вашу проблему, бросая все в stageTable без какого-либо отношения к владельцу. Что происходит, когда транзакция наконец фиксируется, в stageTable остаются все промежуточные результаты, готовые для чтения следующей транзакцией? Возможно, вам следует использовать временную таблицу #stageTable, которая обеспечит естественную изоляцию между параллельными потоками.

Чтобы понять стоимость использования изоляции моментального снимка, прочитайте Использование ресурсов управления версиями строк :

  • дополнительное место занято в базе данных tempdb
  • дополнительное место, занимаемое в каждой строке таблицы данных
  • дополнительное пространство, используемое в хранилище BLOB для больших полей
...