2016-08-22 94 views
2

需要关于此的一些想法..我有一个Temp_Table与一些数据。根据Temp_Table中的数据,我将删除表(外键)中的相关行,然后将Temp-table中的所有数据插入到table1中。像下面的例子。在同一事务中插入和删除?

知道我们在这里只用了几百行,而不是每天添加或更改太多的行也很重要。而且,我正在SSIS中的分离任务中运行插入/删除语句,该语句正在工作。

问题!! 以什么方式可以放置一个锁在Server2.Table1(独占我supose)并在放开该锁之前同时运行Delete和Insert语句?我不希望任何人在执行删除/插入操作时读取或写入表1。请注意,删除操作必须在 Insert语句之前运行

有没有一种方法是SSIS来做到这一点?或者我可以在开始时使用Begin事务并在语句后提交事务?我担心Delete和Insert会在同一个事务中同时运行,是吗?可能有一些好方法可以做到这一点,但我还没有弄清楚。

我还没有用我最好的朋友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 /安德烈亚斯

+1

将这些语句置于BEGIN TRANSACTION ... COMMIT之间不会同时运行它们(它们将一起提交/回滚)。取决于您的隔离级别,所获取的任何锁定将保留在位,直到事务完成或回退 – SteveR

+0

让我们先问您到底想要完成什么。您正在删除表中与临时表相关的所有行,然后插入临时表结果。如果行存在,你真的试图执行UPDATE,如果它们不存在则插入?您可以使用临时表来跟踪要修改的记录,以便锁定不会影响,或者可以按照以下建议使用输出,或者? – Matt

+0

我应该补充一点,如果你确实需要在整个表上获得一个锁,你可以在删除之前把它抛出:SELECT 1 FROM Table1 WITH(TABLOCKX) – SteveR

回答

-4

我不是最好的SQL,但你可以删除INSERT/UPDATE/DELETE来自其他用户的权限,直到你完成了。

REVOKE INSERT, UPDATE, DELETE ON Table1 FROM [username] 

可能有更好的方法。

你也可以在删除触发器上插入插入,但不会保证没有其他事务会进入。

0

您可以使用OUTPUT子句中删除插入到临时表中

DELETE FROM dbo.table1 
OUTPUT DELETED.* INTO @MyTable --or temp table 
WHERE id = 10 

在这种情况下,两个操作会在单个事务..

0

SteveRs评论是正确的,的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 

Delete语句先执行,然后执行Insert语句。独占锁定将不会在两个语句之间释放。

相关问题