有人可以告訴我,如果SQL服務器中的某個過程中發生死鎖,可能會導致僅丟失幾張表中的數據?該過程已插入幾個表中,但數據從幾張表中丟失。這是可能的,還是由於其他問題而發生?從死鎖中部分數據丟失?
而且還從一些表
有人可以告訴我,如果SQL服務器中的某個過程中發生死鎖,可能會導致僅丟失幾張表中的數據?該過程已插入幾個表中,但數據從幾張表中丟失。這是可能的,還是由於其他問題而發生?從死鎖中部分數據丟失?
而且還從一些表
默認情況下,一些局部數據丟失,交易需要在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 try
和xact_state()
,但以上是基礎知識。
感謝您的寶貴意見。這有助於戰利品。 –
如果插入失敗,則不應打亂現有數據。當然,除非您正在執行插入操作的觸發器,這些插入操作會更改數據,並且在沒有事務保護的情況下運行潮溼且非常狂野。 –
如果你插入到多個表中並且你的錯誤處理沒有以正確的方式實現,那麼當然可能只有部分數據被插入 –
多表插入將是全或無的因爲插入是在同一事務的上下文中完成的。在同一事務上下文中完成的所有修改都將被提交或回滾,導致回滾受害事務的死鎖。 –