- - PR -
複数のUPDATEステートメント処理について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-10-04 16:32
お世話になっています。
素朴な質問ですみませんが 現在、VB6でADOを使い SQL Server 2000に処理をしているのですが、 TSQLのUPDATE処理で同時に複数のテーブル更新したい時 >-----------------------------------------------------------< SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; UPDATE テーブルA WITH (ROWLOCK) SET 項目='A' WHERE 条件='条件1'; IF(@@ERROR!=0) BEGIN ROLLBACK TRANSACTION; END; UPDATE テーブルB WITH (ROWLOCK) SET 項目='B' WHERE 条件='条件2'; IF(@@ERROR!=0) BEGIN ROLLBACK TRANSACTION; END; UPDATE テーブルC WITH (ROWLOCK) SET 項目='C' WHERE 条件='条件3'; IF(@@ERROR!=0) BEGIN ROLLBACK TRANSACTION; END; COMMIT TRANSACTION >-----------------------------------------------------------< と、しましたが、 どれか1つのテーブルが失敗しても、 残りの2つのテーブルは更新されると思いました。 そこで >-----------------------------------------------------------< SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; DECLARE @FLG int; SET @FLG=0; UPDATE テーブルA WITH (ROWLOCK) SET 項目='A' WHERE 条件='条件1'; IF(@@ERROR!=0) BEGIN @FLG=@FLG+1; END; UPDATE テーブルB WITH (ROWLOCK) SET 項目='B' WHERE 条件='条件2'; IF(@@ERROR!=0) BEGIN @FLG=@FLG+1; END; UPDATE テーブルC WITH (ROWLOCK) SET 項目='C' WHERE 条件='条件3'; IF(@@ERROR!=0) BEGIN @FLG=@FLG+1; END; IF(@FLG<>0) BEGIN ROLLBACK TRANSACTION; END; COMMIT TRANSACTION >-----------------------------------------------------------< と、してみました。 この書き方であれば、どれかテーブル更新が失敗したら 全ての更新を無効にできると思いますが、 いろいろな書き方があると思いますが、 一般的にもっと簡単な書き方などないでしょうか^^; もっと美しい書き方があればご教授願いたいと思いますm(_ _)m [ メッセージ編集済み 編集者: ハヤセ 編集日時 2004-10-04 16:41 ] [ メッセージ編集済み 編集者: ハヤセ 編集日時 2004-10-04 16:43 ] |
|
投稿日時: 2004-10-04 16:47
こんにちは。
1つでも処理がエラーだったらロールバックするのであれば、エラーが発生したらGoto文を使ってRollbackに飛ばしてはいかがでしょう? 余計な処理をしない分、レスポンスが向上します。たぶん。 ただ、Goto文が嫌いなひとにはお勧めしませんが BEGIN TRANSACTION; DECLARE @FLG int; SET @FLG=0; UPDATE テーブルA WITH (ROWLOCK) SET 項目='A' WHERE 条件='条件1'; IF(@@ERROR!=0) BEGIN GOTO ROLLBACK _SP END; UPDATE テーブルB WITH (ROWLOCK) SET 項目='B' WHERE 条件='条件2'; IF(@@ERROR!=0) BEGIN GOTO ROLLBACK _SP END; UPDATE テーブルC WITH (ROWLOCK) SET 項目='C' WHERE 条件='条件3'; IF(@@ERROR!=0) BEGIN GOTO ROLLBACK _SP END; COMMIT_SP: COMMIT TRANSACTION return (0) ROLLBACK _SP: ROLLBACK TRANSACTION; _________________ 整理とは捨てることらしい。 [ メッセージ編集済み 編集者: ごー 編集日時 2004-10-04 16:49 ] |
|
投稿日時: 2004-10-04 19:23
なるほど、ありがとうございます。
TSQLは、GOTO文が使えたのですね^^; IF(@@ERROR!=0) GOTO ROLLBACK _SP と記述を変えたら、昔なつかし、N88BASICを思い出してしまいました。 |
|
投稿日時: 2004-10-04 20:07
一部訂正
全ての 「@FLG=@FLG+1;」 は、「SET @FLG=@FLG+1;」 の間違いです。 |
1