Нужны некоторые мысли об этом .. У меня есть Temp_Table с некоторыми данными. Основываясь на данных в Temp_Table, я удалю связанные строки из таблиц (внешний ключ), а затем вставьте все данные из таблицы Temp в таблицу1. Как пример ниже.INSERT и DELETE в той же транзакции?
Также важно знать, что мы работаем только с несколькими сотнями строк, не так много строк добавляются или меняются каждый день. И что я сейчас запускаю операторы Insert/Delete в отдельной задаче в SSIS, которая работает.
Вопрос !! Каким образом я могу поместить блокировку на Server2.Table1 (исключая, я полагаю), и запускать как операторы «Удалить», так и «Вставить», прежде чем отпустить эту блокировку? Я не хочу, чтобы кто-нибудь читал или писал в Table1, пока я делаю свои Delete/Inserts. Обратите внимание, что Delete должен быть запущен до инструкции Insert.
Есть ли способ SSIS для этого? Или я могу использовать транзакцию Begin в начале и совершить транзакцию после операторов? Я боюсь, что и «Удалить», и «Вставка» будут выполняться одновременно в одной и той же транзакции, не так ли? Вероятно, есть хороший способ сделать это, который я еще не понял.
Я еще не нашел четкого ответа, используя моего лучшего друга Google. И я хочу, чтобы быть абсолютно уверенным, прежде чем я попробовать что-то из ..
DELETE Table1
FROM Table1 t1
INNER JOIN (
SELECT Column2 FROM Temp_Table
GROUP BY Column2
) t2 ON t1.Column2 = t2.Column2
INSERT INTO Table1
SELECT (Column1, Column2...)
FROM Temp_Table
Thx/Andreas
Ввод этих утверждений между BEGIN TRANSACTION ... COMMIT не запускает их достаточно одновременно (они будут выполняться/откатываться вместе, хотя). В зависимости от уровня изоляции любые приобретенные блоки будут сохраняться до тех пор, пока транзакция не будет завершена или не вернется. – SteveR
Давайте начнем с вопроса, что именно вы пытаетесь выполнить. Вы удаляете все строки из таблицы, связанные с вашей временной таблицей, а затем вставляете результат вашей временной таблицы. Вы действительно пытаетесь сделать UPDATE, если строки существуют и вставляются, если они этого не делают?вы можете использовать вашу временную таблицу для отслеживания изменений записей, чтобы блокировка не имела значения, или вы можете использовать вывод, как предлагается ниже, или ??? – Matt
Я должен добавить, что если вам действительно нужно получить блокировку по всей таблице, вы можете выбросить ее перед удалением: SELECT 1 FROM Table1 WITH (TABLOCKX) – SteveR