- - PR -
JDBCを用いたSQL Serverへのアクセス
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 経由では違った動きになってしまいます。 何かご存知の方はいらっしゃいませんでしょうか。 |
|
投稿日時: 2006-04-18 13:30
自己レスになります。
あれからいろいろ試してみたのですが、以下のことがわかりました。 (解決したわけではありませんが) 問題の現象、「クエリアナライザと JDBC 経由での挙動の違い」について、 java.sql.PareparedStatement を使わず java.sql.Statement を利用することで、 とりあえずは挙動が同じになることを確認できました。 つまり、インデックスを利用することによるロックレコードの回避が確認できた、ということです。 PareparedStatement と Statement の挙動の違いについては、 さすがにこれ以上の検証は無理なので、メーカーに確認することにします。 |
1