これは、私が運用サーバーで実行している奇妙な問題です。これは過去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サービスはかなり呼び出されます。誰かがこれまでにこのようなものを見たことがありますか?私は今、完全に途方に暮れています...
どんな助けや提案も大歓迎です!
トランザクションが失敗し、ロールバックされ、コミットするものがないようです
そのようなものの例
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によって
同じ問題がありました。これは私がそれを解決するためにしたことです。
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
私の問題は、BEGIN TRANとCOMMIT TRANの前後にBEGINとENDが必要だったことです。
BEGIN
BEGIN TRAN
INSERT BlaTest VALUES(5)
GO
COMMIT TRAN
END