Sql-Server

何時送出插入?

  • May 31, 2019

如果我突出顯示/選擇下面的兩個語句,它們之間沒有 GO stmt,插入是否會在結果窗格中顯示“受影響的行 1234”後送出?如果是這樣,我可以在不回滾插入的情況下取消重建過程嗎?

Insert into tablexx
Exec RebuildDisableIndexes,'Rebuild', tablexx

這些是迄今為止的結果:

(2000000) rows affected;
2 of 7 indexes have been rebuilt by the proc RebuildDisableIndexes (alter index...Rebuild step 2 of 7).

但是有些事情讓第 3 步陷入困境。

如果我取消查詢,它會回滾 2000000 行的插入嗎?我不認為它會,但尋求確認。

我剛剛進行了測試,看看會持續存在什麼行為。見下文,這是 sql server 2012

create table kevin_test (
id int
)
go

insert into kevin_test values (1)
insert into kevin_test values (2)
exec kevin_test1

kevin_test1 sp 看起來像這樣

create procedure kevin_test1 as 
begin

WAITFOR DELAY '00:00:05'

select * from kevin_test

end

當你執行它時,一旦程式碼命中儲存過程,我就會取消對 sp 的呼叫,我添加了 waitfor 延遲,所以我實際上可以取消它,否則它會太快。

我發現即使取消了對 proc 的呼叫,這些值仍然被送出給 kevin_test 表。因此,是的,我認為值是由插入送出的,如果在插入後取消 proc 呼叫,插入所做的更改仍然會送出。

如果你做了這樣的事情,情況就不是這樣了

begin tran
insert into table values(...)
exec proc
commit tran

如果您取消了 proc 呼叫,它也會回滾插入。這是一個通用測試,您可以通過測試您的特定程式碼來確認。

如果您沒有顯式打開事務,您將在 自動送出模式下操作

這意味著您可以自行INSERT SQL Server打開 a並在完成後送出它。此時它可以向您顯示“受影響的行”。一旦承諾,就不能再這樣做了。transaction``INSERT``INSERT``rolled back

只有在那之後您的sp啟動和此sp/您的手動中斷中的任何錯誤都不會影響以前的任何內容committed transaction

您在一個語句中執行這兩個語句batch(“沒有 GO ”)的事實僅在第一個語句中發生錯誤時才會影響:第二個語句可能仍被執行或batch可以中止,但在您的情況下,第一個語句是已經committed,所以沒有什麼可以做到rollback的。

在這裡您可以找到使用 Rollback進行批量中止的範例。

引用自:https://dba.stackexchange.com/questions/239486