問題タブ [transaction-isolation]
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 - Entity Framework 4でデータを読み取るときにトランザクションを使用するにはどうすればよいですか?
Microsoft SQL Server2008R2のSNAPSHOTトランザクション分離レベルをEntityFramework4.0で利用しようとしています。しかし、これは私が最初に思ったほど簡単ではないようです。
SNAPSHOT分離レベルを使用するには、データベースで有効にする必要があります。私はそれをしました。また、SQL Management Studioを使用して、SNAPSHOT分離レベルがデータベースで期待どおりに機能することをテストしました。行またはテーブル全体をロックせずに一貫した読み取りが必要なため、この分離レベルを使用したいと思います。これで、データベースでSNAPSHOT分離レベルを使用できるようになりました。ここまでは順調ですね。
WPFアプリケーションである私の再現アプリケーションには、単一のテーブルからいくつかのデータをロードするウィンドウがあります。ボタンをクリックするたびに一度に5行をロードします。これはウィンドウのXAMLです。
そして、これはウィンドウのコードビハインドです:
ここでは魔法のように何も起こっていません。次に、アクションが発生するビューモデルへのコードについて説明します。
私がここでやろうとしているのは、データベースへの接続を開き、それを開いたままにすることです。トランザクションを開始して、SNAPSHOT分離レベルを要求しようとしています。これにより、ウィンドウが開いているときに誰かが行を編集、削除、または挿入した場合でも、一度に5行を読み取り、ウィンドウを開いたときの行を取得できます。しかし、SQL Profilerを使用してトレースを実行すると、ウィンドウが開いたとき、または行をロードしたときにトランザクションが開始されず、要求した分離レベルが設定されていません。ウィンドウが開くと、接続が開かれ、EntityFrameworkはトランザクション分離レベルをデフォルトの分離レベルであるREADCOMMITTEDに設定します。DbTransactionの代わりにTransactionScopeを使用した場合も、同じことが起こります(つまり何も起こりません)。
だから私の質問は:SNAPSHOT分離レベルでトランザクションを開始し、ウィンドウが開いている限りそれを開いたままにするにはどうすればよいですか?他のユーザーが追加した行を読み取らずに、接続からデータを読み取り続けることができるように、トランザクションを開いたままにしておくことが絶対に必要です。
生のSQLコマンドでそれができることは知っていますが、可能であればそれを避けたいと思います。
補足:人々はさまざまな分離レベルでさまざまな意見を持っていますが、この質問は、この場合にSNAPSHOT分離レベルが適切であるかどうかを議論するためのものではありません。SNAPSHOTは、このタスクのビジネス要件と完全に連携します。他の分離レベルもこのコードでは機能しないため、問題は他の分離レベルについても同様である可能性があります。
database - 書き込みのためにDBテーブルまたは行の範囲をロックする方法は?
主キーを持つ単純なテーブルがあります。読み取り操作のほとんどは、キーの正確な値によって 1 つの行をフェッチします。
各行のデータは、キーの順序でその前後の行と何らかの関係を維持しています。したがって、新しい行を挿入するときは、間に入る2行を読み取り、計算を行ってから挿入する必要があります。
懸念事項は、明らかに、別の接続が同じ間隔でキー値を持つ行を同時に追加する可能性があることです。2 番目の挿入が失敗するのとまったく同じキーの値である場合はカバーされますが、キーの値が異なるが同じ間隔である場合、関係が壊れる可能性があります。
解決策は、新しい行を追加することを決定したときに書き込み用にテーブル全体をロックするか、(可能であれば、疑わしい) キー値の間隔をロックすることです。それでも、その時点で読み取り専用トランザクションがブロックされないようにしたいと思います。
クライアント プログラムと IBM DB2 フリー エディションで C++ 用の libodbc++ ラッパーを使用して ODBC を使用しています (ただし、DB の選択は変更される可能性があります)。これは私がやろうと思ったことです:
- 自動コミットとデフォルトの分離モードで接続を開始します
- 新しい行を追加する必要がある場合は、auto-commit を false に設定し、分離モードを serialized に設定します
- 新しいキー値の前後の行を読み取る
- 新しい行を計算して挿入する
- 専念
- 自動コミットとデフォルトの分離モードに戻る
これは仕事をしますか?他のトランザクションは同時に読み取ることができますか? それを行う他の/より良い方法はありますか?
ところで、libodbc++ i/fa で読み取り専用トランザクションを指定する方法がわかりません。odbcで可能ですか?
編集:非常に有用な回答をありがとう、私は1つを選択するのに苦労しました.
sql - SQLServerフォーラムのクエリを挿入
フォーラムテーブルと多くのユーザーが同時にメッセージを挿入することを考えると、このトランザクションはどの程度安全ですか?
ここで、最後のMessageIdを読み取り、それをインクリメントします。グループに挿入されたメッセージごとにインクリメントする必要があるため、IDフィールドを使用できません(テーブルに挿入されたすべてのメッセージではありません)。
sql - 「更新の競合が原因でスナップショットアイソレーショントランザクションが中止された」を修正するにはどうすればよいですか?
トランザクション分離レベルに関連するエラーメッセージが表示されます。関連するテーブルは2つあり、最初のテーブルはトランザクション分離レベルがSERIALIZABLEに設定されて頻繁に更新され、 2番目のテーブルは最初のテーブルに外部キーを持っています。
2番目のテーブルの挿入または更新を行うときに問題が発生します。数時間に1回、次のエラーメッセージが表示されます。
更新の競合が原因でスナップショットアイソレーショントランザクションが中止されました。スナップショットアイソレーションを使用して、データベース'DB'のテーブル'dbo.first'に直接または間接的にアクセスして、別のトランザクションによって変更または削除された行を更新、削除、または挿入することはできません。トランザクションを再試行するか、更新/削除ステートメントの分離レベルを変更してください。
2番目のテーブルを挿入または更新するときにトランザクション分離レベルを設定しません。また、コマンドDBCC USEROPTIONSを実行すると、read_committedが返されます。
database - データベース接続はセッションと同じですか?
との関係について少し混乱しています
- データベース オープン セッション
- 接続プーリング
詳しく説明すると、私は Oracle 9i DB で JDBC を使用しており、接続をプールするために接続プールも使用しています。
私が知りたいのは、接続がプールでアイドル状態になっている場合、それらOpen Session
はデータベースと関連付けられているかということです。プールでアイドル状態の接続が 5 つある場合、対応するアクティブなセッションが 5 つあり、データベースで開いているということですか?
mysql - MYSQL 5(データベース分離)からの奇妙な動作
データベース(MySQL5)を操作するために2つのコマンドウィンドウを開きました。
以下は、私が使用しているテーブル構造です(実行して自動コミットをオフにしたことに注意してくださいset autocommit=0;
):
テーブル構造:
以下は一連の活動です。
ステップ1: コマンドウィンドウ1で、以下のコマンドを実行しました。出力も表示されます。
ステップ 22番目のコマンドウィンドウで、以下のコマンドを実行しましたが、ハングします(commitコマンドが前のウィンドウから発行されるのを待っているようです)
ステップ3
コマンドウィンドウ#1に移動し、実行しましたcommit
。以下の出力を見ることができます:
同時に、以前にハングしていた2番目のウィンドウもコマンドを実行し、出力の下に出力されていることがわかりました。
ステップ 42番目のウィンドウでcommitを発行して、2番目のセッションでもすべての変更が正しくコミットされるようにします。
ステップ5 コミットが両方のウィンドウから発行されたので、すべてが正常であり、2つのセッションも同期している必要があると思ったので、最初のコマンドウィンドウに移動し、以下のコマンドを発行します。
2番目のコマンドウィンドウ(つまり)からの変更がでコミットされたためにCity
値を期待していたので驚きましたが、まだ列に入っています。'Dublin'
update
Step 4
Wil
City
私はここで何が間違っているのですか?
database - Seralization Isolationレベルの実用的な使用法は?
どのシナリオでSERIALIZABLE分離レベルを使用しますか?ウェブサイトで、トランザクションを完全に分離したい場合は、通常、これを使用するという回答をいくつか見ました。
あなた自身の経験から知りたいのは、これをプロジェクトで使用したとき、またはこれが他のプロジェクトで使用されているのを見たとき、他の分離レベルでは満たされていない特定の要件は何かということです。 ?
transactions - MySQL / InnoDBは真のシリアル化可能な分離を実装していますか?
InnoDBエンジンが真のシリアル化可能な分離1を実装するのか、スナップショット分離を実装するのかは、 MySQLのドキュメントからは完全には明らかではありません。これは、紛らわしいことに「シリアル化可能」とも呼ばれます。どちらですか?
MySQL InnoDBがそうでない場合、完全に無料の本番品質のRDBMSはありますか?
1ここで、「真のシリアル化可能な分離」とは、SQL標準による読み取り異常だけでなく、書き込みスキュー異常も存在しないことを意味します。これについては、ここでさらに詳しく説明します。
hibernate - 明示的に設定されていない場合、休止状態が使用するデフォルトの分離レベルは何ですか?
接続プール用に hibernate バージョン 3.6.4 と c3p0 バージョン 0.9.1.2 を使用するアプリケーションがあります。私の基礎となる RDBMS は、MySql バージョン 5.0.67 です。
私のインストールした MySql は、デフォルトのトランザクション分離レベルが "REPEATABLE-READ" (4) であることを示しています。
hibernate.cfg.xml 内またはアプリケーション内のどこでも、トランザクション分離レベルを変更または構成していません。アプリから、次のコードを使用して構成を出力します。
そして、次の結果が得られます。
だから、私の質問は次のとおりです。
- 「2」という値はどこから来たのですか? デフォルトは REPEATABLE_READ であるのに、getDefaultTransactionIsolation()が READ_COMMITTED を返すのはなぜですか?
- 結局、休止状態が使用する分離レベルは何ですか? REPEATABLE_READ または READ_COMMITTED?
- 分離レベルが設定されていない場合、休止状態は基礎となるデータベースのデフォルトを使用する必要があると考えました。これは本当ですか?おそらく、jbdc ドライバーの実装が独自にデフォルトを設定し、休止状態がこれを使用するのでしょうか?
sql-server - Seam&Hibernateでトランザクションを再試行するための最良の方法
Seam&Hibernate(JDBCからSQLServer)で動作するSeamWebアプリケーションがあります。
正常に動作していますが、高負荷(JMeterによるストレステスト)では、いくつかLockAcquisitionException
またはがありOptimisticLockException
ます。
これLockAquisitionException
は、SQLServerException
「トランザクション(プロセスID 64)が別のプロセスとのロックリソースでデッドロックし、デッドロックの犠牲者として選択されました。トランザクションを再実行してください」が原因です。
次に、そのようなトランザクションを再実行するためのSeamInterceptorを作成しましたLockAquisitionException
。
最初の質問:このインターセプターは正しく機能すると思いますか?
グーグルで調べて、Alfresco(ここでフォーラムトークを使用)を見ると、BonitaとOrchestraStaleObjectStateException
にはそのようなトランザクションを再実行する方法がいくつかあり、たとえば(私の原因)のように、はるかに多くの例外をキャッチしていますOptimisticLockException
。
私の2番目の質問は次のとおりです:(StaleObjectStateException
「行が別のトランザクションによって更新または削除された(または保存されていない値のマッピングが正しくなかった)」)の場合、データベースと@Version
フィールドとの同期の問題であるため、通常はトランザクションを再実行することはできませんではない ?たとえば、Alfrescoがそのような例外によって引き起こされたそのようなトランザクションを再実行しようとするのはなぜですか?
編集:LockAcquisitionException
によって引き起こされたためSQLServerException
、私はウェブ上のいくつかのリソースを見てきました、そして私が私のコードを再確認する必要があるとしても、それはとにかく起こる可能性があるようです...ここにリンクがあります:
- このテーマに関する記事(リソースが不足することによっても発生する可能性があるというコメント付き)
- サブリンクのある別の記事:
Microsoftでさえ、「デッドロックを最小限に抑えることはできますが、完全に回避することはできません。そのため、フロントエンドアプリケーションはデッドロックを処理するように設計する必要があります。」