- PR -

SQL Server コミット後のタイムラグについて

1
投稿者投稿内容
まめまめまめ
会議室デビュー日: 2003/05/19
投稿数: 17
投稿日時: 2004-06-02 16:27
Visual Basic 6.0 SP3にてバッチ処理、aspにてwebシステム開発を行いました。
本番稼動開始より、本日まで2年半ほど経過しております。
昨日、下記の現象が発生しました。

DBサーバの環境
OS :Windows 2000 Advanced Server SP3
DB :SQL Server 2000
HDD:RAID5

<現象>
Aというアプリケーション(vb.exe)にて、
管理テーブルにレコードをINSERTしているのですが、その内容が
Bというアプリケーション(asp)から参照できるまでにタイムラグが発生しています。

Aアプリケーションではトランザクション処理を行っており、
全件処理が正常に行われるまでコミットは行いません。

ログにて確認すると、このアプリケーションは、
開始/終了とも 2004/05/31 17:01:49であり、正常終了しています。
即ち 2004/05/31 17:01:49の時点でコミットされています。

INSERTされたレコードには、Aアプリケーションの開始時刻が登録されているのですが、
確かに2004/05/31 17:01:49となっています。

がしかし、2004/05/31 17:44の時点でBアプリケーションより、
管理テーブルを参照すると、INSERTされたレコードが抽出されません。
同条件で、2004/06/01 09:55の時点では、抽出されています。

Bアプリケーションでの抽出条件は、
レコードがINSERTされていればヒットするものであり、
時刻には関係ないものです。

プログラムにてコミットしたデータが、
実際にDBに反映され、参照できるまでにタイムラグが発生する、
というようなことは起こりうるのでしょうか。

過去に、トランザクションログの切捨てを行っておらず、
ログファイルの容量が膨大になってしまい、いろいろ不可解な現象が
起こっているサーバですので上記のようなことも起こりうるのかな、と・・・。

大変拙い説明で申し訳ないのですが、何卒ご教授のほど、宜しくお願い致します。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2004-06-02 17:10
ターゲットテーブルは同じテーブルですよね?

Aから一時テーブルへINSERTして、
夜間バッチで一気に本番テーブルへINSERTしていることはないですよね?

同じテーブルであれば、
commit後、必ず確定されると思いますよ。
まめまめまめ
会議室デビュー日: 2003/05/19
投稿数: 17
投稿日時: 2004-06-02 17:39
raystarさんご返答有難うございます。

引用:

raystarさんの書き込み (2004-06-02 17:10) より:
ターゲットテーブルは同じテーブルですよね?



ターゲットテーブルはもちろん同じテーブルです。

引用:

Aから一時テーブルへINSERTして、
夜間バッチで一気に本番テーブルへINSERTしていることはないですよね?



確定されるはずなのですが、commitしたプログラムとは
別のプログラムから内容が参照できませんでした。

ちなみに、本日は再現しなかったそうです。
(先ほど、客先より報告ありました)
tahakoda
ベテラン
会議室デビュー日: 2002/08/17
投稿数: 79
投稿日時: 2004-06-03 00:50
お話を聴く限りちょっと原因究明は困難かと思います。

現時点で確認できることは・・

@SQLエラーログを見て「2004/05/31 17:01:49」前後でエラーが発生していないか確認する
ログパンクエラー、DB破損エラーがあるかもしれません。

Aその時間帯のシステム使用状況の確認
もしかして他のユーザーがデータを更新していたり何気にバッチが失敗&リトライしていた。。なんてことは?。

BVBバッチの起動方法は?。あとバッチ実行のログの出力結果とかはないのか。


次回再現時には以下の方法を試すこともできます(ASPからデータが見れない場合の直後)。

1.SQLプロファイラを起動しASPからのSQLをキャプチャします。これをクエリアナライザなど
から実行しデータが検索できるか確認します。同様にバッチのINSERT結果もクエリアナライザから確認します。

2.sp_who、sp_lockなどを確認し同時実行ユーザーの有無を確認

3.SQLエラーログの採取

とりあえず思いつくのはこんな感じですね。タイムラグの話はちょっとわかんないです。。
まめまめまめ
会議室デビュー日: 2003/05/19
投稿数: 17
投稿日時: 2004-06-03 09:41
tahakodaさんご返答有難うございます。
やはり、困難ですか。。。

引用:

@SQLエラーログを見て「2004/05/31 17:01:49」前後でエラーが発生していないか確認する
ログパンクエラー、DB破損エラーがあるかもしれません。



この現象は客先にて発生しており、現在正常稼動しているため、
見ることは不可能です。不具合が再発すれば、見ることはできますが。。

引用:

Aその時間帯のシステム使用状況の確認
もしかして他のユーザーがデータを更新していたり何気にバッチが失敗&リトライしていた。。なんてことは?。



ありません。

引用:

BVBバッチの起動方法は?。あとバッチ実行のログの出力結果とかはないのか。



ホストのJCLにて起動しております。
バッチ実行ログの出力はあり、正常終了しております。

更新は失敗しているのではなく、正常に終了していて
次の日には見えるようになっております。
この様な現象でも、上記@Aは当てはまるのでしょうか。
tahakoda
ベテラン
会議室デビュー日: 2002/08/17
投稿数: 79
投稿日時: 2004-06-03 13:17
まず問題を切り分けます。

1.DB側に問題
現時点ではエラーログを見るほかありません。
採取手順をメールし顧客にファイルを採取するなどをお願いしてみては?。

2.アプリ側に問題
トランザクションがCOMMITされていればデータは他アプリから参照できるはずです。
COMMITされていなければ当然見ることはできません。

推測の話でしたら考えられるのはたとえば。。ターゲットテーブルが別アプリにロックされていてバッチのINSERT自体がWAITしていた、などが考えられます。

いずれにしてもこういう事象の調査には必要資料の採取/調査などがなければ先に進みません。。まずは問題の切り分けかと思います。
1

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