[解決済み] EXECUTE後のトランザクションカウントは、BEGIN文とCOMMIT文の数が不一致であることを示しています。以前のカウント = 1、現在のカウント = 0
質問
を持っています。
Insert
にデータを供給するストアドプロシージャです。
Table1
を取得し
Column1
から値を取得します。
Table1
で、2番目のストアドプロシージャを呼び出して、Table2 にデータを供給します。
しかし、2つ目のストアドプロシージャを次のように呼び出すと
Exec USPStoredProcName
以下のようなエラーが発生します。
EXECUTE の後のトランザクション・カウントは、BEGIN 文と COMMIT 文の数が不一致であることを示しています。以前のカウント = 1、現在のカウント = 0。
他の質問での回答も読みましたが、具体的にどこでコミットカウントが狂っているのかがわかりません。
どうすればいいですか?
TRY/CATCHブロックがある場合、トランザクション中止例外をキャッチして続行していることが原因である可能性があります。CATCHブロックでは、常に
XACT_STATE()
で、中断されたトランザクションやコミット不能な(運命的な)トランザクションを適切に処理します。呼び出し側がトランザクションを開始し、呼び出し側が例えばデッドロック(トランザクションを中断した)に当たった場合、呼び出し側はどのようにしてトランザクションが中断され、「通常通りのビジネス」を継続すべきではないことを呼び出し側に伝えるつもりでしょうか?唯一可能な方法は、例外を再発生させ、呼び出し側にその状況を処理させることである。もしあなたが中断されたトランザクションを黙って飲み込み、呼び出し側がまだ元のトランザクションにいると仮定して続けるなら、騒乱だけが保証されます(そしてあなたが得るエラーは、エンジンがそれ自身を保護しようとする方法です)。
をご覧になることをお勧めします。 例外処理とネストされたトランザクション には、ネストされたトランザクションと例外で使用できるパターンが示されています。
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @trancount int;
set @trancount = @@trancount;
begin try
if @trancount = 0
begin transaction
else
save transaction usp_my_procedure_name;
-- Do the actual work here
lbexit:
if @trancount = 0
commit;
end try
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
if @xstate = -1
rollback;
if @xstate = 1 and @trancount = 0
rollback
if @xstate = 1 and @trancount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
end catch
end
go
関連
-
[解決済み】CREATE VIEW は、バッチ内の唯一のステートメントでなければなりません。
-
[解決済み】PL/SQL SELECTに複数のCOUNT(DISTINCT xxx)を指定すると、予期しない結果になる。
-
[解決済み】SQL Server サブクエリが1つ以上の値を返しました。サブクエリが =, !=, <, <= , >, >= に続く場合、これは許可されません。
-
[解決済み】警告。Aqua Data Studioの集約や他のSET操作でNull値が排除される。
-
[解決済み] ORA-01779: キーが保存されていないテーブルにマップされる列を変更できません。
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?
-
[解決済み] 集計を行わずに行から列へピボット移動する
-
[解決済み] MySQLのON句の不明なカラム
-
[解決済み] トリガーがコンパイルエラーで作成される
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 "指定された集約関数を含まないクエリを実行しようとしました。"
-
[解決済み] ERROR: 参照されたテーブル "bar" の与えられたキーに一致するユニークな制約がありません。
-
[解決済み】SQLクエリ「00904. 00000 - "%s: 無効な識別子"
-
[解決済み] テスト
-
[解決済み】Athena: スケールファクターでリソースを使い果たすクエリ
-
[解決済み] Varchar は Sum 演算子では無効です。
-
[解決済み] 検索エラー ORA-00932: 不整合なデータ型: 期待された DATE は NUMBER になりました。
-
[解決済み] アクセスクエリーエラー(from句のシンタックスエラー)
-
[解決済み] SQLサーバーで文字列をsmalldatetimeデータ型に変換する際、変換に失敗しました(静的値を除く)。
-
[解決済み] SQLiteでどのようにピボットするか、つまり、長い形式で保存されたテーブルを広い形式で選択するか?