問題タブ [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.
sql - ストアド プロシージャでトランザクションを使用するときに発生する問題
私は今、私を怒らせているSQL関連の問題を抱えています:p. これが私のセットアップです:
私は2つのストアドプロシージャを持っています:
親ストアド プロシージャが呼び出されGenerateAnnualPenalty
ます。
GenerateAnnualPenalty
Properties
には SELECT CURSOR があり、 と呼ばれる一連のオブジェクトを反復し、 を適用する必要があるProperty
かどうかを判断します。Penalty
これは、 という名前のブール変数と、 または@ApplyPenalty
のいずれかに0
格納されます1
。また、 で使用されている SQL トランザクションはありませんGenerateAnnualPenalty
。
2 番目に、反復するそれぞれProperty
に対して、という名前の子ストアド プロシージャを呼び出します。への入力として渡されます。SQL トランザクション (コミット/ロールバック) を使用します。GenerateAnnualPenalty
GenerateAnnualPenaltyForProperty
@ApplyPenalty
GenerateAnnualPenaltyForProperty
GenerateAnnualPenaltyForProperty
という名前のテーブルにエントリを作成して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 から入手できます。
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 ブロックの後にコミットされたのを見たように
回答と批評を歓迎します。事前に感謝します。名前を一般化しようとしたため、タイプミスがある場合はご容赦ください...
java - Javaから実行したときにPsqlスクリプトがコミットされない
psql コマンドを実行して SQL スクリプト ファイルをインポートする .bat ファイルがあります。Windows コマンド ラインから .bat ファイルを実行すると、正しく実行されます。しかし、Java から (ProcessBuilder を使用して) .bat ファイルを呼び出すと、スクリプトが終了しません。InputStream、ErrorStream、DB (Postgresql) ログにもエラーはありません。
SQL スクリプトは非常に長いため、追加していません。スクリプトには、下部に COMMIT ステートメントがあります。
何か案は?ありがとう、
c# - SQL Server シーケンス ギャップ
SEQUENCE
テーブルのトランザクション フォリオを設定するために使用した があります。
今日、好奇心のために私は次のことを行いました:
ギャップがあり、テーブルにフォリオが欠落していることに驚きました。
例:
- 898、897、894、892、890、889 ...
つまり、何かが起こっているということです。詳細情報を提供するためにINSERT
、私が使用したストアドプロシージャには、INSERT INTO...
アプリケーションから情報を保存するときにデータベース トランザクションを使用したので、すべてがうまくいけばアプリが実行しCOMMIT TRANSACTION
、うまくいかなければ私が実行しROLLBACK TRANSACTION
ます。
問題の原因はトランザクションにあると思うので、エラーが発生した場合NEXT VALUE
、シーケンスの はすでに生成されており、それROLLBACK
には影響しません。
ギャップのない完全なシーケンスを作成するためにこれを解決する方法の手がかりはありますか?
c# - 複数のメソッドでの単一の SQL トランザクション
モジュール式プログラミングは正しいアプローチですが、時には余分な努力と調査が必要な問題につながることがあります。例として3つのデータベース挿入機能がありますInsertName(),InsertAddress(),InsertPhoneNo()
。いずれかの関数で例外が発生した場合、これらの関数はすべて実行する必要があります。データベースは変更されません。
私にできることは、3 つすべてを 1 つにマージして、sqltransaction を使用することです。
しかし、上記の解決策は私のモジュラーアプローチに反しています。複数の関数をマージせずに1つのSQLトランザクションにバインドすることは可能ですか?そうでない場合、これを達成するための最良の方法はどれですか.
c# - 同じテーブルで DML トランザクションの途中で ALTER TABLE (DDL) を実行できますか?
たとえば、DataTable から SQL テーブルにデータを挿入する C# から SqlTransaction を開始するとしますが、このデータは大量のデータであるため、SQL トランザクション内で SqlBulkCopy を使用して「チャンクで」実行し、すべてのチャンクが正常にコピーされた場合のトランザクション。
ここで、挿入される値の長さがターゲット テーブルの最大列サイズを超える場合があり、その特定の「チャンク」に対してその時点で SqlBulkCopy が失敗することがわかっているとします。この例外をキャッチし、テーブル/列を変更してターゲット列の最大長を増やしてから、SqlBulkCopy を続行して、コピーする次の「チャンク」を取得することは可能ですか (またはお勧めします)あなたが始めた「挿入トランザクション」をコミットしましたか?
つまり、これを言い換えると、DML トランザクションを開始し、このコミットされていないトランザクションの途中で停止し、DDL を実行してターゲット テーブルを変更し、元の DML を完成させてコミットすることは可能ですか?
php - PHP + MySQL - トランザクションはロールバックしない
古いスタイルのmysql_query()
関数を使用してトランザクションを実行しています。トランザクション内のクエリの 1 つが失敗しても、ロールバックしていません。影響を受ける行をデバッグしましたが、それらは 0 または 1 です。構文は次のとおりです。
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 番目のトランザクションは最新の在庫数を使用しますか、それとも両方が同時に実行され、場合によっては両方が失敗する可能性がありますか?
sql-server - XACT_ABORT のスコープは何ですか
SQL Server 2005 での SET XACT_ABORT ステートメントのスコープは何ですか? つまり、begin-end ブロック、プロシージャまたはトリガー、接続、データベース、サーバー?
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.