2016-08-22 71 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語句。獨佔鎖定將不會在兩個語句之間釋放。

相關問題