2015-07-11 44 views
0

有人可以告訴我,如果SQL服務器中的某個過程中發生死鎖,可能會導致僅丟失幾張表中的數據?該過程已插入幾個表中,但數據從幾張表中丟失。這是可能的,還是由於其他問題而發生?從死鎖中部分數據丟失?

而且還從一些表

+1

如果插入失敗,則不應打亂現有數據。當然,除非您正在執行插入操作的觸發器,這些插入操作會更改數據,並且在沒有事務保護的情況下運行潮溼且非常狂野。 –

+0

如果你插入到多個表中並且你的錯誤處理沒有以正確的方式實現,那麼當然可能只有部分數據被插入 –

+0

多表插入將是全或無的因爲插入是在同一事務的上下文中完成的。在同一事務上下文中完成的所有修改都將被提交或回滾,導致回滾受害事務的死鎖。 –

回答

0

默認情況下,一些局部數據丟失,交易需要在SQL Server的明確。所以,如果你的程序的結構是這樣的:

create procedure dbo.doStuff 
as 
begin 
    update table1 …; 
    update table2 …; 
    delete table3 …; 
    insert table4 …; 
end 

並且出現在table3死鎖刪除,更新,以表1 & 2,應考慮耐用的結果(即,他們不會也被死鎖的回滾所回滾)。如果你需要所有的語句成功/失敗,你需要把整個事情包裝在一個事務中。那就是:

create procedure dbo.doStuff 
as 
begin 
    begin transaction; 
     update table1 …; 
     update table2 …; 
     delete table3 …; 
     insert table4 …; 
    commit transaction; 
end 

請記住,這確實有併發影響(你持有到鎖更長) - 是沒什麼免費的。而且,雖然你不能依賴它,但它也可以影響哪個進程是死鎖受害者(因爲選擇的一部分是「將需要多少工作來回滾」)!

如果您願意,您可以(也可能應該!)更加喜歡begin tryxact_state(),但以上是基礎知識。

+0

感謝您的寶貴意見。這有助於戰利品。 –