SAP SQL Anywhere におけるスレッドデッドロックとはどういうことか ?

 

この記事のオリジナルは、Glenn Paulley が sybase.com に 2009 年 5 月に掲載したものです。Glenn はこの中で、SQL Anywhere におけるスレッドデッドロックについて解説するとともに、アプリケーション設計に起因する問題について解説しています。

SQL Anywhere の最新のバージョン(16 以降)では、マルチプログラミングレベルを動的に調整するため、ほとんどの場合 -gn サーバーオプションを設定する必要はありません。しかしながら、これによって Glenn が以下で語っている好ましくない設計を隠すことができたとしても、根本的な解決にはならないことに注意してください。

===

スレッドデッドロックとは、 SQL Anywhere サーバーがある特定のリクエストに対して返す特定のエラー (SQLCODE -307, SQLSTATE ’40W06′) のことです。このブログ記事では、スレッドデッドロックがなぜ、どのように発生するのか、さらには問題の診断に利用できるメカニズムについてまとめたいと思います。

 

SQL Anywhere のスレッディングアーキテクチャー

 

他のデータベース管理システムと同様、SQL Anywhere では基本となるオペレーティングシステムのスレッディングモデルだけに依存するのではなく、独自のスレッディングアーキテクチャーを実装しています。SQL Anywhere は、幅広い OS とハードウェアプラットフォームをサポートしているため — いくつかを挙げると、Windows、Linux、Windows CE、Sun OS、AIX、HP-UX、Mac OS/X など — SQL Anywhere では、オペレーティングシステム上の(例:Windows、Linux)それらをサポートする「lightweight」スレッド (fibersとも呼ばれる) と、これらの OS プラットフォーム上の通常の OS スレッドを利用します。

 

また、SQL Anywhere ではサーバーは特定の一つのスレッド(fiber)を一つの接続に占有させるのではなく、サイズが固定されたサーバースレッドのプールが、サーバーに入ると複数のタスクに動的にアサインされて実行されます。タスクは、アプリケーションまたはストアドプロシージャーからのSQL 文であることが多いものの、一つのスレッドがサービスできるタスクには、様々なタイプがあります。一旦スレッド(fiber)上でタスクがスケジュールされると、 そのスレッドは、そのタスクが完了するまで、またはキャンセルされるまでそのタスクを処理するようアサインされます。

 

SQL Anywhere は、デフォルトではサーバーがスタートするとスレッドを 20 作成します (Windows CE では 3 です)。このデフォルト設定は、-gn コマンドラインスイッチを使用することで変更することができます。実際はスレッド数がサーバーのマルチプログラミングレベル — 1 回にアクティブにできるタスクの最大数 — を決定することになります。サーバースレッドは、そのサーバー上のどのデータベースへの接続数からも独立しています。そのため、ある任意のスレッド (fiber) は、まず データベースのためのタスクをサービスしてから、別のデータベースへの接続のタスクをサービスすることができます。

続きはこちら:SAP SQL Anywhere におけるスレッドデッドロックとはどういうことか ?

 

 

SAPのSAP SQL Anywhere製品ページはこちら