- PR -

複数のUPDATEステートメント処理について

1
投稿者投稿内容
なし
会議室デビュー日: 2004/09/17
投稿数: 17
投稿日時: 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 ]
ごー
ベテラン
会議室デビュー日: 2003/08/29
投稿数: 51
お住まい・勤務地: いるかホテル
投稿日時: 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/09/17
投稿数: 17
投稿日時: 2004-10-04 19:23
なるほど、ありがとうございます。
TSQLは、GOTO文が使えたのですね^^;

IF(@@ERROR!=0) GOTO ROLLBACK _SP

と記述を変えたら、昔なつかし、N88BASICを思い出してしまいました。
なし
会議室デビュー日: 2004/09/17
投稿数: 17
投稿日時: 2004-10-04 20:07
一部訂正

全ての 「@FLG=@FLG+1;」 は、「SET @FLG=@FLG+1;」 の間違いです。
1

スキルアップ/キャリアアップ(JOB@IT)