問題タブ [xact-abort]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - そこで何が起こるの?SQL Server - XACT_ABORT ON + @@ERROR チェック . .
このタイプのシナリオではどうなりますか?
私の推測では、 はXACT_ABORT
決して起こらないため (全体がロールバックされて終了するため)、最後のステートメント ( をチェックしてから呼び出すため) も起こらないからです。ON
COMMIT TRANSACTION
@@error
raiseerror
sql-server-2008 - コミット不可能なトランザクションの処理 SQL SERVER
以下のような手順があります
トランザクション B がエラーをスローしているため、プロセスがコミット不可能な状態になり、以下のエラーがスローされます。XACT_STATE() 値を確認しました -1
メッセージ 3930、レベル 16、状態 1、プロシージャ xxxxxxxx、行 70 現在のトランザクションをコミットできず、ログ ファイルに書き込む操作をサポートできません。トランザクションをロールバックします。
トランザクションBをスキップしてトランザクションCを実行する方法でこれを克服する他の方法はありますか
sql - SETXACT_ABORTONが作成プロシージャで機能しない
SQL Server 2008 SP3(10.0.5500)を使用していますが、ロールバックトランザクションに問題があります。最初に、何かを知る必要があります。これは私の作成プロシージャスクリプトです:
そして、このスクリプトを実行した後、次の手順を確認します。MyDB ->Programmability->StoredProcedures
クリックして変更する[Members].[MyProc]
と、次のスクリプトが表示されます。
それで、どこにありSET XACT_ABORT ON
ますか?そして、なぜそれがここに表示されないのですか?SET XACT_ABORT ON
ストアドプロシージャでのロールバックトランザクションに問題があるため、保存されなかったと思います。私は正しいですか?はいの場合、解決策は何ですか?SET XACT_ABORT ON
ストアドプロシージャで使用できませんか?または私のせいはどこですか?
sql-server - SET XACT_ABORT ONをトランザクションのロールバックにするにはどうすればよいですか?
のBooksOnlineのドキュメントにSET XACT_ABORT ON
基づくと、T-SQLステートメントで実行時エラーが発生した場合、トランザクション全体が終了してロールバックされるという印象を受けます。
備考
SET XACT_ABORTがONのときに、Transact-SQLステートメントで実行時エラーが発生すると、トランザクション全体が終了してロールバックされます。
SQL Server 2008 R2でこれをテストする:
出力を提供します:
SET XACT_ABORT ON
私はまた、エラーが発生した場合にバッチを終了するという印象を受けました:
SET XACT_ABORT ONは、SQL Serverに、トランザクション全体をロールバックし、実行時エラーが発生したときにバッチを中止するように指示します。
それは便利に聞こえます。どうすればそれを行うことができますか?
tsql - 親/子ストアド プロシージャでそれぞれ XACT_ABORT をオン/オフにすると、どのような影響がありますか?
現在のシステムのエラー処理を改善して、より意味のあるエラー メッセージを生成しようとしています。他のネストされたストアド プロシージャを複数回呼び出す "ルート" ストアド プロシージャがあります。
ルート sp ではXACT_ABORT
に設定さON
れますが、ネストされたプロシージャでXACT_ABORT
は に設定されOFF
ます。ルート プロシージャのエラーを取得するのではなく、下位レベルのプロシージャから特定のエラーを取得したいと考えています。
よく見かけるエラーですが、uncommittable transaction is detected at the end of the batch, the transaction is being rolled back.
これらの「混合」環境を で使用することには影響がありXACT_ABORTs
ますか?
また、高度なエラー処理に関する提案があれば、それは大歓迎です。sp_executesql
すべてのストアド プロシージャを変更せずにパラメータを渡してエラー出力を取得しRAISERROR
、親プロシージャのCATCH
ブロックを呼び出すために使用できるように使用したいと思います。
sql-server-2008 - 分散txが失敗したときにエラーコードとメッセージを取得するにはどうすればよいですか?(MS DTC)
さまざまなMSSQL2008データベースを備えたリンクサーバーを介して分散トランザクションを開始するストアドプロシージャがあります。
を使用しております
そしてまた
トランザクションの周囲でエラーをキャッチし、エラーコードとメッセージを呼び出し元のクライアントに返します。
ただし、分散トランザクション内のコマンドが失敗すると、MS DTCが制御を引き継いでいるようで、catchブロックは「正常に」ロールバックできず、エラーメッセージなどを返すことができません。代わりにエラーが発生します:Microsoft分散トランザクションコーディネーター(MS DTC)は分散トランザクションをキャンセルしました。(エラー1206)。
そのような分散txエラーがcatchブロックによってキャッチされる方法はありますか?
tsql - SQL Server 2000 で最初に失敗した挿入でトリガーが終了し、xact_abort を OFF に設定できない
SQL Server 2005 で実行する単純なデータベースを構築しましたが、SQL Server 2000 で動作させる必要があります。目的は次のとおりです。
- ステージング テーブルに最大 5,000 レコードを含む毎日のデータ フィードを受け取ります。
- この挿入が完了すると、単一のレコードが TRIGGER_DATA というテーブルに追加されます。
- このテーブルに「挿入時」のトリガーを作成しました。このトリガーは、一度に 1 レコードずつ FACT_data テーブルにデータを挿入しようとします。
- FACT_data テーブルは、フィールドが受け入れることができる入力を定義する多くの DIM テーブルに外部キー化されています。
- いずれかのレコードが外部キー制約に違反している場合、挿入は失敗し、代わりにレコードを Load_error テーブル (外部キーがなく、すべてのフィールドが Nullable) に挿入する必要があります。
トリガーにはメインの try-catch があり、次に、EXEC ステートメントで 2 番目の try-catch を使用して FACT_data テーブルに挿入し、失敗したレコードを Load_error テーブルに送ります。
互換性レベル 90 (つまり、SQL サーバー 2005) では、トリガー内で XACT_ABORT を OFF に設定でき、すべて正常に動作しているように見えます。以下のコードは動作します。ただし、互換性レベル 80 以下では、トリガー内からこのパラメーターを設定することはできず、挿入エラーが最初に発生したときにコードが失敗します。
現時点で考えられる唯一の回避策は、Stage_data テーブルに on insert トリガーを作成し、各トリガーが 1 行のデータを処理することです。ただし、データ量が非常に大きく、増加する可能性があり、一度に 5000 のトリガーをオフにすることはお勧めできないため、このソリューションは好きではありません。
誰かが解決策の方向性を教えてくれますか?
--------- SQL SERVER 2005 コードの抜粋:
ON TRIGGER_DATA FOR INSERT AS BEGIN SET NOCOUNT ON;
DECLARE @strfields varchar(4000) DECLARE @sql1 VARCHAR(8000); DECLARE @sql2 VARCHAR(8000); DECLARE @row_ID varchar(10)
終わり
どうもありがとう
- - - - - - - 編集: - - - - - - - - - - - - - - - - - - ------
SQL Server 2000 で動作するようにコードを変更しようとしました (つまり、try-catch を @@error チェックに置き換えました)。ただし、FK違反が発生するたびに中止に失敗します。誰が私が間違っているのか教えてもらえますか?
ON TRIGGER FOR INSERT AS BEGIN SET NOCOUNT ON;
DECLARE @row_ID INT
終わり
sql-server - xact_abort をオンに設定し、一緒にキャッチしてみてください
sp に try catch ブロックがあり、try に挿入ステートメントだけがあります。pk 違反の場合はキャッチ チェック エラー コード、違反の場合は更新を行います。しかし、時々「現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。トランザクションをロールバックしてください。
バッチの最後に、コミット不可能なトランザクションが検出されました。トランザクションはロールバックされます。」ということで、xact_abort を追加しましたが、「EXECUTE 後のトランザクション数は、BEGIN ステートメントと COMMIT ステートメントの数が一致していないことを示しています。」というメッセージが表示され続け、これを見つけました。 http://www.ashishsheth.com/post /2009/08/14/Set-XACT_ABORT-ON-and-TryCatch-block-in-Sql-Server-2005.aspx
これが本当なら。xact_abort をオンにして try ブロックにエラーがある場合、catch コードは実行されませんか?
sql - トリガーでのトランザクション処理 (TRY/CATCH....XACT_ABORT ON)
SQL Server 2008R2 でのプロセス シナリオがあります。
• データを収集し、2 つの SQL Server 間でデータを転送するための usp
このプロセスは、プロセスのすべてのレベル (usp、SSIS、およびトリガー) のトランザクションで実行されます。
データを DB7.dbo.Dest に転送するデータ フローでは、このテーブルには AFTER INSERT トリガーがあり、通過したばかりのデータを最終テーブル DB7.dbo.FinalDestination に挿入します。
すべてのレベルで、データの機密性が適切であり、完全に最終テーブルに到達しているため、データについて防御しようとしました。
SSISに関しては、私が読んでテストしたところ、うまく機能しているようです。
私の最大の懸念は、上記でスクリプトを作成したトリガーです。私の読書と理解から、XACT_ABORT ON を設定すると、エラーが発生した場合 (つまり、コミットできないトランザクションがある場合)、TRY ブロック内のトランザクションがロールバックされます。この場合、私は先に進み、CATCH ブロックにロールバック トランザクション部分を追加しました。同時に、INSERT の実行中にテーブルをロックするために、WITH (TABLOCK) オプションを追加しました。
トリガーの場合、XACT_ABORT が ON の場合でも TRY...CATCH は必要ですか? TRY ブロック内で COMMIT TRANSACTION は必要ですか? また、 @@TRANCOUNT に基づく CATCH ブロックの後にコミットされたのを見たように
回答と批評を歓迎します。事前に感謝します。名前を一般化しようとしたため、タイプミスがある場合はご容赦ください...