- PR -

ADOのタイムアウト処理について

1
投稿者投稿内容
なし
会議室デビュー日: 2004/09/17
投稿数: 17
投稿日時: 2005-06-27 12:06
いつもお世話になってます。

今、Windows XPからSQL Server 2000 にVB6からADOを使って
簡単なデータ管理プログラムを作っているのですが
排他処理面でうまく動作しなくて困っています。
どなたかご教授をお願いします。


Aさんが、テーブルAをテーブルロックで開いている時に
Bさんが、テーブルA〜Cまでデータを書き込む処理をしたとします。

テーブルAに書き込む時、タイムアウトが起こるはずなので
テーブルB、Cともにロールバックして欲しいのですが、

みごとに、テーブルAに書き込まれず、
テーブルB、Cのみ更新されてしまいました。

何が足りないのでしょうか?
プログラム処理の流れとして下記のようになっています。



〜 定義略 〜

ADO.BeginTrans

〜プログラム計算〜

〜計算値をSQLで書き込み〜

〜プログラム計算〜

〜計算値をSQLで書き込み〜

〜プログラム計算〜

〜計算値をSQLで書き込み〜

ADO.Executeした時、タイムアウトが1回でもあった場合

ADO.RollbackTrans

ADO.Executeした時、タイムアウトがなかった場合

ADO.CommitTrans

〜 解放略〜
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-27 12:08
引用:

みごとに、テーブルAに書き込まれず、
テーブルB、Cのみ更新されてしまいました。


当たり前の質問ですが、Connection は A, B, C とも同一インスタンスになっていますよね?



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-06-27 12:47
引用:

なしさんの書き込み (2005-06-27 12:06) より:
Aさんが、テーブルAをテーブルロックで開いている時に
Bさんが、テーブルA〜Cまでデータを書き込む処理をしたとします。

テーブルAに書き込む時、タイムアウトが起こるはずなので
テーブルB、Cともにロールバックして欲しいのですが、

みごとに、テーブルAに書き込まれず、
テーブルB、Cのみ更新されてしまいました。




Aさんがかけたというテーブルロックはどのようにかけて、
ロックモードは何でしょうか?

アイソレーションレベルとか、ロックモードを調べてみてください。

(念のためのリンク:http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/acdata/ac_8_con_7a_7xde.asp)

[ メッセージ編集済み 編集者: 夏椰(かや) 編集日時 2005-06-27 12:48 ]
なし
会議室デビュー日: 2004/09/17
投稿数: 17
投稿日時: 2005-06-27 13:06
じゃんぬねっとさん、夏椰(かや)さん、早速のご返答ありがとうございます。

もちろん、インスタンスは同じ物を使っています。


Aさんがかけているロックは、

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; で
SQL文で WITH (TABLOCK) または WITH (ROWLOCK) を入れて
もらっていると思います。


というのも、Aさん側の開発担当者が別で
私が渡した資料では、上記の指定をしたのですが、
どいったコードを組んでいるのか把握できず、
ロック時間が異常に長い状態が続いています。

それを回避するためロック状態の時は、全てロールバックするように
作らないといけないわけです。
(いい作り方ではないのですが仕方なく・・・)

ちなみに、Aさん側のプログラムは、Access 2000のVBAからADOを使っています。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-06-27 13:29
引用:

なしさんの書き込み (2005-06-27 13:06) より:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; で
SQL文で WITH (TABLOCK) または WITH (ROWLOCK) を入れて
もらっていると思います。

というのも、Aさん側の開発担当者が別で
私が渡した資料では、上記の指定をしたのですが、
どいったコードを組んでいるのか把握できず、
ロック時間が異常に長い状態が続いています。



推測では原因は判明できないと思います。
なんで、マネージャからAさん側で作成されたプログラムを
実行しているときのロック状況と
更新処理のロック状況を確認してみてください。
なし
会議室デビュー日: 2004/09/17
投稿数: 17
投稿日時: 2005-06-27 13:53
夏椰(かや)さん、ありがとうございます。

推測というわけでもないのですが、
私の書き方が悪かったのでしょう。

引用:

なしさんの書き込み (2005-06-27 13:06) より:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; で
SQL文で WITH (TABLOCK) または WITH (ROWLOCK) を入れて
もらっていると思います。



と書きましたが、
担当者に連絡はとっており
仕様通り作っているという回答はもらっています。

なので、
トランザクションレベルは、
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

ロックの種類は
WITH (TABLOCK) または WITH (ROWLOCK)
を使って作っています。




じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-06-27 14:35
引用:

ロックの種類は
WITH (TABLOCK) または WITH (ROWLOCK)
を使って作っています。


または?



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-06-27 15:05
テーブルA に書き込まれてないということは、Aさんは正しくテーブルAにロックを掛けているということなのでは? おそらく犯人は B さん。B さんが Aテーブルの書き込み時にスローされた例外を握りつぶして、Bテーブル, Cテーブルへの書き込みを続行してるだけじゃないの?
1

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