- - PR -
SQLSERVER2000でこんな場合にトランザクションを使うことは間違いでしょうか。。
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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件削除されていた。 ということを防ぎたい一心です。 この手の処理を成功させるにはセッション?に着目するのでしょうか。。それともテーブルのロック?などでしょうか。。何卒ご教授願います。 このシナリオでトランザクションは違う気がしております。。 | ||||
|
投稿日時: 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 | ||||
|
投稿日時: 2005-10-05 08:18
お〜!なるほど!それは納得です!
1ステートメントで書くほうは勉強不足でしたのでこれから勉強させていただきます。 ありがとうございました!! | ||||
|
投稿日時: 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の間に他のユーザー(セッション?)によってレコードを操作される場合があると思うのですが。。 何卒ご教授願います。 | ||||
|
投稿日時: 2005-10-06 15:05
2.と3.の間で同じキーの行を挿入された場合は
で発生するSql Exceptionをcatchする。 3.と4.の間で同じキーの行を削除された場合は 事後のことなので諦めて貰うしかないです。 #説明を追加 [ メッセージ編集済み 編集者: Yam 編集日時 2005-10-06 15:30 ] | ||||
|
投稿日時: 2005-10-06 15:51
ありがとうございます。
@@ERRORを確認するということでしょうか。。 | ||||
|
投稿日時: 2005-10-06 16:01
すみません。C#の癖が出てしまいました。
はい、そうです。主キー重複のエラーを検出して処理を行います。 | ||||
|
投稿日時: 2005-10-06 16:54
ありがとうございました!
| ||||
1
