今回は、SQL Serverのロックタイムアウトについてお話したいと思います。
SQL ServerへJavaアプリケーションでJDBC接続するときにロックタイムアウトってデフォルトで何秒なんだろうと思ったのが、この記事を書くきっかけです。
ですので、JDBC接続におけるロックタイムアウトの設定などにも少し触れます。
現在のロックタイムアウト値の確認
現在接続しているセッションのロックタイムアウト値は、以下のSQL文を実行することで確認することができます。
SELECT @@LOCK_TIMEOUT;
実行イメージは以下の通りです。結果に「-1」が出力されています。タイムアウト値が「-1」の場合は、タイムアウトはなく無制限に待つことになります。
ロックタイムアウト値の設定
ロックタイムアウトの設定は、以下のSQL文で設定することができます。
SET LOCK_TIMEOUT <ミリ秒>
SET LOCK_TIMEOUT (Transact-SQL) - SQL Server | Microsoft Learn
実行イメージは以下の通りです。以下では、5000ミリ秒つまり5秒をロックタイムアウトとして設定しています。
なので、5秒経過してもロックが解放されなかった場合はエラーとなります。
JDBC接続におけるロックタイムアウト値の設定
JDBC接続におけるロックタイムアウト値の設定は、Microsoftの以下の公式サイトにその内容が記載されていました。
接続プロパティの設定 - JDBC Driver for SQL Server | Microsoft Learn
以下がロックタイムアウトの接続プロパティの箇所を抜粋しています。
ちょっと分かりづらいですが、プロパティ名は「lockTimeout」で、プロパティのタイプは「INT」、デフォルト値は「-1」になるようです。
右側に説明が記載されていますが、デフォルトは永遠と待ち続けるように設定されるようですね。
データベースがロック タイムアウトを通知するまでに待機する時間 (ミリ秒) です。既定では、無期限に待機します。
設定変更方法
接続プロパティの設定変更方法はいくつかあるようですが、一番簡単に設定するにはJDBC接続プロパティ文字列に以下のように「locktimeout」プロパティを追加すればOKです。
こちらも値はミリ秒なので、5000を指定した場合は5秒待つことなります。
jdbc:sqlserver://localhost;databaseName=db1;user=taro;password=taro;lockTimeout=5000
5秒経過してもロック待ちとなった場合は、以下のように例外が投げられました。