0

管理スタジオで次の SQL を実行すると、クエリは期待される結果を返します。

SELECT MAX(ID) FROM table WHERE field = value;

ただし、クライアント アプリケーション (WinForms) がトランザクションの途中でこの SQL を実行すると、クエリは値を返さずにタイムアウトします。これは、同じ「テーブル」に追加/修正する他の SQL ステートメントがトランザクションに含まれているためだと思われます。

これを回避するにはどうすればよいですか?

4

2 に答える 2

2

"SELECT MAX(ID)" は集約関数であり、テーブルで多くのロックを行います - 共有読み取りロックは、テーブル内のすべてのレコード、確かに基準に一致するすべてのレコード、およびそれに応じたその他のレコードに対して実行される可能性があります行ロックまたはページ ロックが使用されているかどうか。MAX がロックしようとしているこれらのレコードのいずれかに未解決の書き込みロックがある場合、MAX はタイムアウトします。同時にどのようなロックが設定されているかを理解する必要があります。SQL Server を使用している場合は、SQL プロファイラーを使用して、他のトランザクションからのロックを含む、そのテーブルのすべてのロックを示すトレースを取得できます。

于 2012-11-15T16:33:03.867 に答える
0

最後に、トランザクションが開始される前に MAX 関数を使用して SQL ステートメントを移動し、後でトランザクション内で使用できるように値を変数として格納しました。

于 2012-11-16T14:28:08.060 に答える