- - PR -
ADOのタイムアウト処理について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 〜 解放略〜 | ||||
|
投稿日時: 2005-06-27 12:08
当たり前の質問ですが、Connection は A, B, C とも同一インスタンスになっていますよね? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-06-27 12:47
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 ] | ||||
|
投稿日時: 2005-06-27 13:06
じゃんぬねっとさん、夏椰(かや)さん、早速のご返答ありがとうございます。
もちろん、インスタンスは同じ物を使っています。 Aさんがかけているロックは、 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; で SQL文で WITH (TABLOCK) または WITH (ROWLOCK) を入れて もらっていると思います。 というのも、Aさん側の開発担当者が別で 私が渡した資料では、上記の指定をしたのですが、 どいったコードを組んでいるのか把握できず、 ロック時間が異常に長い状態が続いています。 それを回避するためロック状態の時は、全てロールバックするように 作らないといけないわけです。 (いい作り方ではないのですが仕方なく・・・) ちなみに、Aさん側のプログラムは、Access 2000のVBAからADOを使っています。 | ||||
|
投稿日時: 2005-06-27 13:29
推測では原因は判明できないと思います。 なんで、マネージャからAさん側で作成されたプログラムを 実行しているときのロック状況と 更新処理のロック状況を確認してみてください。 | ||||
|
投稿日時: 2005-06-27 13:53
夏椰(かや)さん、ありがとうございます。
推測というわけでもないのですが、 私の書き方が悪かったのでしょう。
と書きましたが、 担当者に連絡はとっており 仕様通り作っているという回答はもらっています。 なので、 トランザクションレベルは、 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ロックの種類は WITH (TABLOCK) または WITH (ROWLOCK) を使って作っています。 | ||||
|
投稿日時: 2005-06-27 14:35
または? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-06-27 15:05
テーブルA に書き込まれてないということは、Aさんは正しくテーブルAにロックを掛けているということなのでは? おそらく犯人は B さん。B さんが Aテーブルの書き込み時にスローされた例外を握りつぶして、Bテーブル, Cテーブルへの書き込みを続行してるだけじゃないの?
|
1