- PR -

JDBCを用いたSQL Serverへのアクセス

1
投稿者投稿内容
gradriel
会議室デビュー日: 2005/11/21
投稿数: 2
投稿日時: 2006-04-11 13:40
はじめて投稿します。

最近になって初めて SQL Server 2000 を利用することになりました。
しかしながら、JDBC 経由でのアクセスでどうにも理解できない挙動をしています。

[環境]
DBMS: Microsoft SQL Server Workgroup SP4
OS: Windows XP Professional
JDBC: Microsoft SQL Server 2000 Driver for JDBC ver2.2.0037

[理解できていること]
・SQL Server は、あるトランザクションで insert したデータは、
トランザクションの分離レベルによらず、そのトランザクションが
終了するまで排他ロックをかけて保護している。
・上記状態で、他のトランザクションが該当レコードに触れた場合、
排他ロック待ちで待機状態となる
・ロック待ちにならないためには、インデックスを利用して、
該当レコードを検索対象に含まないように条件を設定する必要がある。
(インデックスが設定されていないと全件リードになるので不可)
・この現象は、実際にクエリアナライザを用いて検証できている。

[不可思議な現象]
・上記、SQL Server の仕様を踏まえて、JDBC (日本語版 SP2) 経由で
Java アプリによって現象を確認したところ、インデックスを利用して
該当レコードを回避してもロック待ちが起きてしまう。
これがなぜ起こるのかわかっていない。

クエリアナライザで検証までできた現象が、JDBC 経由では違った動きになってしまいます。
何かご存知の方はいらっしゃいませんでしょうか。
gradriel
会議室デビュー日: 2005/11/21
投稿数: 2
投稿日時: 2006-04-18 13:30
自己レスになります。

あれからいろいろ試してみたのですが、以下のことがわかりました。
(解決したわけではありませんが)

問題の現象、「クエリアナライザと JDBC 経由での挙動の違い」について、
java.sql.PareparedStatement を使わず java.sql.Statement を利用することで、
とりあえずは挙動が同じになることを確認できました。
つまり、インデックスを利用することによるロックレコードの回避が確認できた、ということです。

PareparedStatement と Statement の挙動の違いについては、
さすがにこれ以上の検証は無理なので、メーカーに確認することにします。
1

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