SQL プロファイラを確認するだけでアプリケーション エラーをデバッグしようとしています。(コードにアクセスできません)。
アプリケーションのエラーは言う
ここで、フロントエンド コマンドの実行時に SQL プロファイラを実行し、コミットされていないコマンドを特定しようとしました。正確なクエリを投稿することはできませんが、主要な部分を投稿します。
プロファイラーROLLBACK
では、次の更新ステートメントの後に呼び出されました (私が知っていることから、INSERT/UPDATE/DELETE ステートメントのみがロールバックされます)。
UPDATE transactions
SET refference = N':ICBilling 8/9/2013'
,type1 = 1
,notes = N'Billing'
,dateModified = convert(DATETIME, N'08/09/2013 10:33:13AM', 101)
,moduleModifiedBy = N'PM'
WHERE transaction_id = 1100001368
プロファイラーを上にスクロールして以前に何が起こったかを確認したところ、このレコードがtransactions
テーブルに挿入されていることがわかりました。
INSERT INTO transactions (
transaction_id,
uRefference,
Type1,
Notes,
ModuleModifiedBy,
)
VALUES (
1100001368
, NULL
, 0
, NULL
, convert(DATETIME, N'08/09/2013 10:33:13AM', 101)
)
この挿入の直前にBEGIN TRANSACTION
コマンドがありました。操作がテーブルにINSERT
コミットされていないため、更新するレコードが見つからないため、ステートメントがエラーを引き起こすと思いました。Transactions
UPDATE
(SQL Server でこれらのクエリを使用してこのアイデアをテストしましたが、一時テーブルを作成し、その直後begin transaction
に一度に実行しました)
CREATE TABLE #tempx (i INT);
INSERT INTO #tempx VALUES (1),(2),(3);
BEGIN TRANSACTION
INSERT INTO #tempx VALUES (4);
UPDATE #tempx
SET i = 5
WHERE i = 4
クエリUPDATE
が実行され、問題なく実行されたので、この可能性を排除しました。SQL Server MS から直接クエリを実行することとアプリケーションからクエリを呼び出すことの違いについては疑問がありましたが、さらにグーグルで調べたところ、暗黙的なトランザクションを行うにはいくつかのパラメーターを設定する必要があることがわかりました ( here )。
それで、プロファイラーに戻り、一番上にこれが見つかりました
SET QUOTED_IDENTIFIER ON
SET ARITHABORT OFF
SET NUMERIC_ROUNDABORT OFF
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET CONCAT_NULL_YIELDS_NULL ON
SET CURSOR_CLOSE_ON_COMMIT OFF
SET IMPLICIT_TRANSACTIONS OFF
SET LANGUAGE us_english
SET DATEFORMAT mdy
SET DATEFIRST 7
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
これは本番DBであり、問題がないかどうか完全にはわからないため、まだ設定IMPLICIT_TRANSACTIONS
を試みていません。ON
そのため、より経験豊富な人々の助けを借りて、問題が発生している可能性のある場所 (コードまたは SQL Server の設定) を見つけるか、少なくともドリルダウンするのを手伝ってもらいたいと思います。
アップデート:
エラーをスローするコードの部分にアクセスすることができました
If Not myExceptionOccured And Not SessionKey Is Nothing Then
If SessionKey.Connection.IsInTranState Then
Dim Message As String = String.Format("Could not complete Page_Unload. There are {0} uncommitted transactions. All changes were rolled back.", SessionKey.Connection.TransactionCount)
そのため、現時点では、セッションが閉じられておらず、トランザクションが SQL Server によってコミットされていないことが明らかです。
他のトランザクションを変更しようとしましたが、うまくいきました。しかし、どうやらこのトランザクションだけに問題があるようです。これらのトランザクションについて両方のプロファイラーを比較してみます。違いが見つかるかもしれません。
それまでの間、誰かが私が間違った方向に進んでいると思われる場合は、コメントを残してください.
更新#2:
私が言ったように、私は機能する別のトランザクションをプロファイリングし、ロールバックが呼び出された後にクエリを調べました。
両方の場合(機能する場合とロールバックする場合)のクエリは次のとおりです(私の質問の冒頭と同じです):
UPDATE transactions
SET refference = N':Billing 8/16/2013'
,type1 = 1
,notes = N'Billing'
,dateModified = convert(DATETIME, N'08/16/2013 12:47:25PM', 101)
,moduleModifiedBy = N'PM'
WHERE tranId = --transaction id here--
それらの唯一の違いは、更新するトランザクション ID と時間です (GETDATE()
現在の時間を取得する関数があります)。
それだけです。一方のトランザクションはコミットされ、もう一方はコミットされません。
他の提案はありますか?