2017-12-29 16 views
1

私は、このストアドプロシージャを持っている(は一切ありトランを開始しておらず、コミットされSQL - 接続の問題が発生したときにストアドプロシージャの一部だけが実行された可能性はありますか?例えば

DECLARE @ID1 int 
DECLARE @ID2 int 

--Let's say this insert takes 1 second. 
INSERT INTO table1 (field1,field2) 
VALUES('test', 1) 

--And this insert takes another second. 
INSERT INTO table2 (field1,field2) 
VALUES ('testing', 2) 
SQL Serverがあるため、停電の1.5秒(本当の話)の後に下がるならば起こったであろう何

+0

は、いずれかの手順の最後にCOMMITありますか? – twyly

+0

両方が実行される可能性があります。サーバーから切断しても、SQLサーバーがダウンしてアクセス不能になることはありません。テスト –

+0

としてDBCC Opentranで確認してください。@twylyコミットはなく、ロールバックはありません。 –

答えて

2

あなたがtransactionにあなたのストアドプロシージャを実行する場合:

begin tran 
    exec sp 
commit 

とクライアントが切断し、それを実行しながら、あなたのSPによって行わ作品全体がロールバックされます。

あなたがいないトランザクションからあなたPROCを呼び出し、1 insertと他の間のクライアントが接続を切断する場合は、終了しましたinsertが切断中に実行していたinsertがロールバックされ、影響を受けません。

REPRO:

create table dbo.table1 (id int); 
go 

create proc dbo.sp_test 
as 
--Let's say this insert takes 1 second. 
INSERT INTO dbo.table1 
VALUES(1) 
waitfor delay '00:05:00' 
--And this insert takes another second. 
INSERT INTO dbo.table1 
VALUES (2) 
go 


--open new query window and write there: 
begin tran 
    exec dbo.sp_test; 
commit; 

-- wait for some seconds; close this window 
-- now check for what was inserted: 

select * 
from dbo.table1; 
--- 
-- nothing was inserted 


--open new query window and write there: 

    exec dbo.sp_test; 

-- wait for some seconds; close this window 
-- now check for what was inserted: 

select * 
from dbo.table1; 
--- 
--1 
+0

それは私が考えていたことです、このシナリオを再現する方法はありますか? –

+2

もちろんです。あなたのコードが最初の挿入から5分後に待ってから、SSMSクエリーウィンドウを閉じて、数秒後にあなたのSPを実行し、トランザクション/プロセスからあなたのprocを実行すると、waitfor delay '00:05:00 '明示的なトランザクションなしで、何が挿入されたテーブルを確認してください – sepupic

+0

Thx、データベースレベルで、すべてのストアドプロシージャがBegin Tran Rollbackを持っているかのように定義できますか、それとも手動で行う必要がありますか? –

関連する問題