- PR -

SQLSERVER2000でこんな場合にトランザクションを使うことは間違いでしょうか。。

1
投稿者投稿内容
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-10-04 18:53
いつもお世話になっております。
Access2000+SQL2000SERVERで ADOで組んでおります。

あるテーブルについて、データを削除するのですが、テーブル上のレコードが0件になるとまずいというシナリオです。ここでデータの件数検査と削除処理を一連の動作とさせたいがためにトランザクションを使うことが合っているかどうか。。

1・DB接続オープン
2・BeginTrans
3・"SELECT COUNT(フィールド1) FROM T1" をADOで実行する。
4・結果を検査してT1にレコードが一件しかなければ削除しない。(Exit?)
5・そうでなければ
 "DELETE FROM T1 WHERE フィールド1=xxxxx" をADOで実行
6・成功すればCommitTrans

ここでトランザクションを使いたがっているのは3の時点ではレコードが2件あったが5を実行するときには既に他のユーザー(セッション?)から1件削除されていた。
ということを防ぎたい一心です。

この手の処理を成功させるにはセッション?に着目するのでしょうか。。それともテーブルのロック?などでしょうか。。何卒ご教授願います。

このシナリオでトランザクションは違う気がしております。。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-10-04 22:13
1. トランザクション開始
2. とりあえず delete
3. 件数確認
 3-A 件数が 0 件ならロールバック (delete した行が復帰する)
 3-B 件数が 1 件以上ならコミット


または、1ステートメントで書いてしまえばアトミックになるので、明示的なトランザクション制御は不要かな。

delete from T1 where フィールド1=xxxxx
and (select count(*) from T1 with (UPDLOCK) ) >= 2
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-10-05 08:18
お〜!なるほど!それは納得です!

1ステートメントで書くほうは勉強不足でしたのでこれから勉強させていただきます。
ありがとうございました!!
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-10-06 14:59
 それでは次のようなシナリオの場合はどうすればよろしでしょうか。。


[テーブル t1]
s_id(int型 主キー)
a_id(int型 主キー)
a_data

ここでADOから
s_id=100
a_id=200
をキーがダブらないようにインサートしたいと思います。

1. "SELECT s_id FROM t1 WHERE s_id=100 AND a_id=200" を実行
2. この結果がEOFなら
3. "INSERT INTO t1 VALUES(100, 200, xxx)"を実行
4. EOFでなければ
5. msgbox "主キーがダブっとります。"

この場合も2と3の間や4と5の間に他のユーザー(セッション?)によってレコードを操作される場合があると思うのですが。。
何卒ご教授願います。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2005-10-06 15:05
2.と3.の間で同じキーの行を挿入された場合は
引用:

3. "INSERT INTO t1 VALUES(100, 200, xxx)"を実行


で発生するSql Exceptionをcatchする。

3.と4.の間で同じキーの行を削除された場合は
事後のことなので諦めて貰うしかないです。

#説明を追加

[ メッセージ編集済み 編集者: Yam 編集日時 2005-10-06 15:30 ]
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-10-06 15:51
ありがとうございます。
@@ERRORを確認するということでしょうか。。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2005-10-06 16:01
すみません。C#の癖が出てしまいました。
引用:

@@ERRORを確認するということでしょうか。。


はい、そうです。主キー重複のエラーを検出して処理を行います。
McLaren
ぬし
会議室デビュー日: 2002/01/15
投稿数: 784
お住まい・勤務地: 東京
投稿日時: 2005-10-06 16:54
ありがとうございました!
1

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