ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverのロックタイムアウトについて

今回は、SQL Serverのロックタイムアウトについてお話したいと思います。

SQL ServerJavaアプリケーションでJDBC接続するときにロックタイムアウトってデフォルトで何秒なんだろうと思ったのが、この記事を書くきっかけです。

ですので、JDBC接続におけるロックタイムアウトの設定などにも少し触れます。

現在のロックタイムアウト値の確認

現在接続しているセッションのロックタイムアウト値は、以下のSQL文を実行することで確認することができます。

SELECT @@LOCK_TIMEOUT;

実行イメージは以下の通りです。結果に「-1」が出力されています。タイムアウト値が「-1」の場合は、タイムアウトはなく無制限に待つことになります。

f:id:mr_star:20211027221822p:plain
ロックタイムアウト値の確認

ロックタイムアウト値の設定

ロックタイムアウトの設定は、以下のSQL文で設定することができます。

SET LOCK_TIMEOUT <ミリ秒>

SET LOCK_TIMEOUT (Transact-SQL) - SQL Server | Microsoft Docs

実行イメージは以下の通りです。以下では、5000ミリ秒つまり5秒をロックタイムアウトとして設定しています。
なので、5秒経過してもロックが解放されなかった場合はエラーとなります。

f:id:mr_star:20211027222546p:plain
ロックタイムアウトの設定

JDBC接続におけるロックタイムアウト値の設定

JDBC接続におけるロックタイムアウト値の設定は、Microsoftの以下の公式サイトにその内容が記載されていました。
接続プロパティの設定 - JDBC Driver for SQL Server | Microsoft Docs

以下がロックタイムアウトの接続プロパティの箇所を抜粋しています。
ちょっと分かりづらいですが、プロパティ名は「lockTimeout」で、プロパティのタイプは「INT」、デフォルト値は「-1」になるようです。

右側に説明が記載されていますが、デフォルトは永遠と待ち続けるように設定されるようですね。

データベースがロック タイムアウトを通知するまでに待機する時間 (ミリ秒) です。既定では、無期限に待機します。

f:id:mr_star:20211027013013p:plain
接続プロパティ(locktimeout)

設定変更方法

接続プロパティの設定変更方法はいくつかあるようですが、一番簡単に設定するにはJDBC接続プロパティ文字列に以下のように「locktimeout」プロパティを追加すればOKです。
こちらも値はミリ秒なので、5000を指定した場合は5秒待つことなります。

jdbc:sqlserver://localhost;databaseName=db1;user=taro;password=taro;lockTimeout=5000

5秒経過してもロック待ちとなった場合は、以下のように例外が投げられました。

f:id:mr_star:20211027013657p:plain
ロックタイムアウトによるエラー

おわりに

いかがでしたでしょうか。

ここまで見てきた通り、ロックタイムアウト値はデフォルトでは無制限に待つという設定値ですので場合によっては永遠と待つことにならないようにタイムアウト値は設定しておいたほうが良いかもしれません。タイムアウトが発生することで、ある処理で不要なブロッキングが長時間発生していることが判明したりするかもしれません。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。