2011-06-25 16 views
1

transactionで使用しているか、rollbackを使用する必要があります。十分なトランザクションでコミットを使用していますか?

tabel1 
    name nvarchar(10) 
    family nvarchar(20) 

table 2 
    name nvarchar(10) 
    family nvarchar(20) not null 

begin transaction 
insert into table2 (name) values('john') 
insert into table1 (name,family) values('Joe','Lando') 
commit transaction 

ご覧のとおり、最初の文にはエラーがあります。私はどこかでロールバックを使うべきですか?

+0

スクリプトをどのように実行しますか?テーブル定義はスクリプトの一部です(そのような場合は、1.正しくありません。2.トランザクション外です)。 –

答えて

2

あなたがリンクからSET XACT_ABORT ON (SQL Server 2000 link)

SET XACT_ABORT ON 
begin transaction 
insert into table2 (name) values('john') 
insert into table1 (name,family) values('Joe','Lando') 
commit transaction 

を使用する場合はROLLBACKをスキップすることができます。

SET XACT_ABORTがONになっている、のTransact-SQLステートメントは、実行時エラーが発生した場合、全体のトランザクションは終了し、ロールバックされます。

ここでは、使用しない場合ロールバックが必要です。または、接続を閉じます。

SET XACT_ABORT ONの有用な副作用の1つは、クライアントCommandTimeoutイベントの後にロックが解放され、トランザクションがロールバックされることです。それ以外の場合は、接続がのハードウェアがSQL Serverから削除されるまで発生しません。プーリングのために開いたままになります。

あなたの聖書は"Error Handling in SQL 2000 – a Background" by Erland Sommarskogである必要があります:それを読んでください。そして、SO:Do I really need to use "SET XACT_ABORT ON"?

0

まず、table2に 'family'フィールドがないことを認識するため、ストアドプロシージャが実際にコンパイルされるのではないかと疑いがあります。

第2に、あなた自身の正気のために何らかの形でのチェックを組み込むことをお勧めしますが、いずれにしても、SQLサーバーはエラーで自動的にロールバックします。

関連する問題