問題タブ [sqltransaction]

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.

0 投票する
2 に答える
864 参照

sql - ストアド プロシージャでトランザクションを使用するときに発生する問題

私は今、私を怒らせているSQL関連の問題を抱えています:p. これが私のセットアップです:

私は2つのストアドプロシージャを持っています:

親ストアド プロシージャが呼び出されGenerateAnnualPenaltyます。

GenerateAnnualPenaltyPropertiesには SELECT CURSOR があり、 と呼ばれる一連のオブジェクトを反復し、 を適用する必要があるPropertyかどうかを判断します。Penaltyこれは、 という名前のブール変数と、 または@ApplyPenaltyのいずれかに0格納されます1。また、 で使用されている SQL トランザクションはありませんGenerateAnnualPenalty

2 番目に、反復するそれぞれPropertyに対して、という名前の子ストアド プロシージャを呼び出します。への入力として渡されます。SQL トランザクション (コミット/ロールバック) を使用します。GenerateAnnualPenaltyGenerateAnnualPenaltyForProperty@ApplyPenaltyGenerateAnnualPenaltyForPropertyGenerateAnnualPenaltyForProperty

という名前のテーブルにエントリを作成してDebugLog、コード内の特定のポイントに到達したかどうかをマークします。

子のスケルトンは次のGenerateAnnualPenaltyForPropertyとおりです。

問題 (イントロ):

GenerateAnnualPenaltyこの特定の順序で4 を反復するとPropertiesします (これは問題を悪用します)。

反復する最初のプロパティ:@PROPERTY_ID = 1

反復する 2 番目のプロパティ:@PROPERTY_ID = 2

反復する 3 番目のプロパティ:@PROPERTY_ID = 3

反復する 4 番目のプロパティ:@PROPERTY_ID = 4

プロパティ 1、3、および 4 についてApplyPenalty = 1は 、プロパティ 2 については、ApplyPenalty = 0

問題 (主な核心):

プロパティ 1 に対して が呼び出されるとGenerateAnnualPenaltyForProperty、すべて問題ありません。チェックポイント 1 とチェックポイント 2 の両方のエントリがDebugLogテーブルに表示されます。

プロパティ 2 に対して が呼び出されるとGenerateAnnualPenaltyForProperty、すべて正常に戻ります。チェックポイント 1 とチェックポイント 2 の両方のエントリがDebugLogテーブルに表示されます。

プロパティ 3 に対して が呼び出されるとGenerateAnnualPenaltyForProperty、間違ったシナリオが発生します。テーブルにはチェックポイント 1 エントリしかDebugLog表示されませんが、'チェックポイント 2' エントリも表示されているはずです!

プロパティ 4 に対して が呼び出されるとGenerateAnnualPenaltyForProperty、再び正しい結果が得られます。チェックポイント 1 とチェックポイント 2 の両方のエントリがDebugLogテーブルに表示されます。

したがって、問題ApplyPenalty = 1は、前の反復でApplyPenalty = 0. このような場合、 のプロパティはApplyPenalty = 1あたかもそうであるかのように扱われます。ApplyPenalty = 0

SQL トランザクション コードを無効にすると問題は解決しますが、その理由は?:

SQL トランザクションに関連するすべてのコードを無効にするとGenerateAnnualPenaltyForProperty、すべて正常に動作します。上記の問題が修正されました。GenerateAnnualPenaltyForProperty以下は、動作する SQL トランザクション コードが取り出された のスケルトンです。

質問 (???):

なぜこの動作が発生するのですか? SQL トランザクションの commit/rollback into を使用するGenerateAnnualPenaltyForPropertyと、問題のあるケースでストアド プロシージャが機能しないのはなぜですか?

実際のコード:

子ストアド プロシージャの完全なコードを見たい場合は、https ://gist.github.com/anonymous/5214236 から入手できます。

0 投票する
1 に答える
4889 参照

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 ブロックの後にコミットされたのを見たように

回答と批評を歓迎します。事前に感謝します。名前を一般化しようとしたため、タイプミスがある場合はご容赦ください...

0 投票する
1 に答える
564 参照

java - Javaから実行したときにPsqlスクリプトがコミットされない

psql コマンドを実行して SQL スクリプト ファイルをインポートする .bat ファイルがあります。Windows コマンド ラインから .bat ファイルを実行すると、正しく実行されます。しかし、Java から (ProcessBuilder を使用して) .bat ファイルを呼び出すと、スクリプトが終了しません。InputStream、ErrorStream、DB (Postgresql) ログにもエラーはありません。

SQL スクリプトは非常に長いため、追加していません。スクリプトには、下部に COMMIT ステートメントがあります。

何か案は?ありがとう、

0 投票する
1 に答える
1096 参照

c# - SQL Server シーケンス ギャップ

SEQUENCEテーブルのトランザクション フォリオを設定するために使用した があります。

今日、好奇心のために私は次のことを行いました:

ギャップがあり、テーブルにフォリオが欠落していることに驚きました。

例:

  • 898、897、894、892、890、889 ...

つまり、何かが起こっているということです。詳細情報を提供するためにINSERT、私が使用したスト​​アドプロシージャには、INSERT INTO...

アプリケーションから情報を保存するときにデータベース トランザクションを使用したので、すべてがうまくいけばアプリが実行しCOMMIT TRANSACTION、うまくいかなければ私が実行しROLLBACK TRANSACTIONます。

問題の原因はトランザクションにあると思うので、エラーが発生した場合NEXT VALUE、シーケンスの はすでに生成されており、それROLLBACKには影響しません。

ギャップのない完全なシーケンスを作成するためにこれを解決する方法の手がかりはありますか?

0 投票する
3 に答える
5091 参照

c# - 複数のメソッドでの単一の SQL トランザクション

モジュール式プログラミングは正しいアプローチですが、時には余分な努力と調査が必要な問題につながることがあります。例として3つのデータベース挿入機能がありますInsertName(),InsertAddress(),InsertPhoneNo()。いずれかの関数で例外が発生した場合、これらの関数はすべて実行する必要があります。データベースは変更されません。

私にできることは、3 つすべてを 1 つにマージして、sqltransaction を使用することです。

しかし、上記の解決策は私のモジュラーアプローチに反しています。複数の関数をマージせずに1つのSQLトランザクションにバインドすることは可能ですか?そうでない場合、これを達成するための最良の方法はどれですか.

0 投票する
1 に答える
208 参照

c# - 同じテーブルで DML トランザクションの途中で ALTER TABLE (DDL) を実行できますか?

たとえば、DataTable から SQL テーブルにデータを挿入する C# から SqlTransaction を開始するとしますが、このデータは大量のデータであるため、SQL トランザクション内で SqlBulkCopy を使用して「チャンクで」実行し、すべてのチャンクが正常にコピーされた場合のトランザクション。

ここで、挿入される値の長さがターゲット テーブルの最大列サイズを超える場合があり、その特定の「チャンク」に対してその時点で SqlBulkCopy が失敗することがわかっているとします。この例外をキャッチし、テーブル/列を変更してターゲット列の最大長を増やしてから、SqlBulkCopy を続行して、コピーする次の「チャンク」を取得することは可能ですか (またはお勧めします)あなたが始めた「挿入トランザクション」をコミットしましたか?

つまり、これを言い換えると、DML トランザクションを開始し、このコミットされていないトランザクションの途中で停止し、DDL を実行してターゲット テーブルを変更し、元の DML を完成させてコミットすることは可能ですか?

0 投票する
1 に答える
1216 参照

php - PHP + MySQL - トランザクションはロールバックしない

古いスタイルのmysql_query()関数を使用してトランザクションを実行しています。トランザクション内のクエリの 1 つが失敗しても、ロールバックしていません。影響を受ける行をデバッグしましたが、それらは 0 または 1 です。構文は次のとおりです。

0 投票する
1 に答える
1472 参照

mysql - MySQL トランザクションをショッピング カートのチェックアウト プロセスに適用する

少し前に構築したこのオンライン ショップがあり、製品在庫テーブルで LOCK TABLES を使用して、在庫が 0 を下回ったり、適切に更新されなかったりしないようにしています。

最近、データベースに多くのトラフィックと多くの操作 (他の LOCK TABLES も) があったため、データの一貫性を維持するためのより高速で安全な方法がないか自問自答しています。

トランザクションとその仕組みを理解しようとしていますが、次のロジックがチェックアウト プロセスにうまく適用されるかどうか疑問に思っています。

1) START TRANSACTION (これにより、いずれかのクエリが失敗した場合、または在庫などの他の条件が必要以上に低い場合に、後続のクエリをロールバックできます)

2) 「customers」テーブルに顧客を挿入します

3) 'orders' テーブルに注文情報を挿入する

4) 異なるテーブルへの同様のクエリ

5) カート内の各製品について:

5.1) update products set stock = stock - x where stock - x >= 0 (x は顧客が購入したい単位)

5.2) 影響を受ける行を確認し、影響を受ける行 == 0 の場合は ROLLBACK して終了します (現在の製品の在庫が不足しているため、注文をキャンセルするか、エラーをスローします)。

5.3) その他のクエリ...など

6) コミット

その音は正しいですか?

私が得られない (そして、そもそも心配する必要があるかどうかわからない) のは、同時セッション (別の顧客) が同じものを配置しようとした場合に、「製品」テーブルと在庫数に何が起こるかです。注文または同じ商品の一部を含む注文。

2 番目のトランザクションは最初のトランザクションが終了するのを待ち、2 番目のトランザクションは最新の在庫数を使用しますか、それとも両方が同時に実行され、場合によっては両方が失敗する可能性がありますか?

0 投票する
1 に答える
2020 参照

sql-server - XACT_ABORT のスコープは何ですか

SQL Server 2005 での SET XACT_ABORT ステートメントのスコープは何ですか? つまり、begin-end ブロック、プロシージャまたはトリガー、接続、データベース、サーバー?

0 投票する
1 に答える
1301 参照

java - JDBC transaction, execution order of sql statements

I have following JDBC code:

And I would like 2 prepared statements to be part of one JDBC transaction. I am wondering whether order at which they are created will be the execution order of SQL statements: delete first and inserts - after.