And*_*eas 5 sql sql-server ssis
我有一个包含一些数据的 Temp_Table。根据Temp_Table中的数据,删除其他表中的相关行,然后将Temp-table中的所有数据插入到table1中。就像下面的例子。
我可以通过什么方式在 Server2.Table1 上放置一个锁(我认为是独占的)并在释放该锁之前运行 Delete 和 Insert 语句?我不希望任何人在执行删除/插入操作时读取或写入 Table1。请注意,Delete 必须在 Insert 语句之前运行。
SSIS 有没有办法做到这一点?或者我可以在开始时使用开始事务并在语句之后提交事务吗?我担心删除和插入会在同一个事务中同时运行。
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
Run Code Online (Sandbox Code Playgroud)
SteveR的评论是正确的,事务中的Insert和Delete语句没有同时运行。在对非生产数据库进行一些测试后,我得到了以下结果:
BEGIN TRY
BEGIN TRAN T1;
DELETE Table1
FROM Table1 t1
INNER JOIN (
SELECT Column2 FROM Temp_Table
GROUP BY Column2
) t2 ON t1.Column2 = t2.Column2
INSERT INTO Table1 (Column 1, Column2...)
SELECT (Column1, Column2...)
FROM Temp_Table
COMMIT TRAN T1;
END TRY
BEGIN CATCH
ROLLBACK TRAN T1;
END CATCH
Run Code Online (Sandbox Code Playgroud)
首先执行Delete 语句,然后执行Insert 语句。并且语句之间不会释放Exclusive锁。