web-dev-qa-db-ja.com

COMMIT TRANSACTIONリクエストには対応するBEGIN TRANSACTIONがありません

これは、私が運用サーバーで実行している奇妙な問題です。これは過去2週間に2回発生しており、これは大量のトラフィックを取得するサーバーです。

WebサービスにBEGIN TRANを実行し、いくつかのSQLクエリ(2つの挿入とそれに続く更新)を実行するコードがあります。次に、最後にCOMMITを実行します。 2回、ログにメッセージが表示されます。

COMMIT TRANSACTIONリクエストには、対応するBEGIN TRANSACTIONはありません。

最初の2つの挿入と更新の間に別のWebサービスを呼び出すため、COMMITが呼び出される前に、最初の2つの挿入と最後の更新の間にわずかな遅延が生じる可能性があります。これは私たちの問題を引き起こしているのでしょうか? IIS 7およびServer 2008 R2(すべての更新が適用されています)でこれを実行しています。

もともとはアプリプールがリサイクルされる可能性はありましたが、それを真夜中にリサイクルするように変更しました。 SQLサーバーがBEGIN TRANの呼び出しを忘れる原因は何なのか、今はわかりません。

このWebサービスはかなり呼び出されます。誰かがこれまでにこのようなものを見たことがありますか?私は今、完全に途方に暮れています...

どんな助けや提案も大歓迎です!

19
Sophtware

トランザクションが失敗し、ロールバックされ、コミットするものがないようです

そのようなものの例

CREATE TABLE BlaTest(id INT PRIMARY KEY NOT NULL)
GO

これを実行します

BEGIN TRAN

INSERT BlaTest VALUES('a')
GO

COMMIT TRAN

ここにエラーがあります

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value 'a' to data type int.
Msg 3902, Level 16, State 1, Line 2
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

これは問題なく実行されます

BEGIN TRAN

INSERT BlaTest VALUES(5)
GO

COMMIT TRAN

トランザクションに関する優れた記事は SQL 2005以降のエラー処理 Erland Sommarskogによって

32
SQLMenace

同じ問題がありました。これは私がそれを解決するためにしたことです。

COMMIT TRANSACTIONリクエストには対応するBEGIN TRANSACTIONがありません

SQLクエリをチェックしてBEGIN TRANを追加した後、正常に実行されます。ここに私のサンプルコード。それが動作します:

ALTER procedure [dbo].[DeactivateUser]
    @UserId bigint,
    @LoginEmail Nvarchar(100),
    @merchantId int
    as
    Begin
      Begin tran

        update Users set 
        LoginEmail='inactive'+CONVERT(VARCHAR(11), getdate(), 106)+'-'+@LoginEmail,
        IsActive=0 
        where LoginEmail=@LoginEmail and MerchantID=@merchantId                     
        if(@@ERROR=0)
          begin
            commit Tran
            select 0
          end
        else
          begin
            rollback Tran
            select -1
          end


    end
0
Praveen04

私の問題は、BEGIN TRANとCOMMIT TRANの前後にBEGINとENDが必要だったことです。

BEGIN
     BEGIN TRAN

     INSERT BlaTest VALUES(5)
     GO

     COMMIT TRAN
END
0
arush436