問題タブ [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.

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

sql-server - T-SQL トランザクションがスレッドセーフではないのはなぜですか?

次の (サニタイズされた) コードでは、これらのエラーが発生することがあります。

テーブル 'database.dbo.Table' を削除できません。テーブルが存在しないか、権限がないためです。
データベースには、'Table' という名前のオブジェクトが既に存在します。

コードは同時に複数回実行できます。壊れる理由わかる人いますか?

0 投票する
7 に答える
2866 参照

sql - ROLLBACK の可能性がある TRANSACTION 内で行われた特定の変更のみをコミットする

これは元の質問からの大幅な編集であり、より簡潔にし、既存の回答によって提起されたポイントをカバーしています...

単一のトランザクション内で複数のテーブルに複数の変更を加え、一部の変更のみをロールバックすることは可能ですか?

以下の TSQL では、「myLogSP」によって行われた変更がロールバックされることは望ましくありません。ただし、さまざまな myBusinessSP によって行われたすべての変更は、必要に応じてロールバックする必要があります。

順序は重要です。myLogSP は、myBusinessSP の間および後に発生する必要があります (myLogSP は、myBusinessSP によって行われた変更を取得します)。

データベースの整合性を維持し、必要に応じてすべての変更をロールバックできるようにするために、すべての myBusinessSP が 1 つのトランザクション内で発生することも重要です。

あたかも、myLogSP がトランザクションの一部ではないかのように動作することを望んでいるかのようです。(myBusinessSP 間で呼び出す必要があるため) それらがたまたま 1 つの内部にあるというのは不都合な事実です。

編集:

最終的な答えは「いいえ」です。唯一のオプションは、コードを再設計することです。ロギングにテーブル変数を使用するか (変数はロールバックされないため)、トランザクションを必要としないようにビジネス ロジックを再設計します...

0 投票する
4 に答える
991 参照

sql-server-2005 - SQL Server 2005 で「autonumber」フィールドを実装するにはどうすればよいですか?

IDENTITY フィールドは知っていますが、問題を解決するために使用できないと感じています。

複数のクライアントがいるとしましょう。各クライアントには複数の注文があります。各クライアントは、注文に固有の順番に番号を付ける必要があります。

テーブル構造の例:

このテーブルの行の例は次のとおりです。

クライアントのMAX ClientOrderIDを取得し、その値をINSERTに使用するのが単純な方法であることはわかっていますが、これは同時実行の問題の影響を受ける可能性があります。トランザクションを使用することを検討していましたが、これに使用できる最も広い分離範囲がよくわかりません。LINQ to SQL を使用しますが、それは関係ないと感じています。

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

sql-server - あるストアド プロシージャ内から、より低いトランザクション分離レベルを設定する別のストアド プロシージャを呼び出しても問題ありませんか?

データベース内のいくつかの条件をチェックし、フラグの結果を返すだけのユーティリティ プロシージャが多数あります。これらのプロシージャは、WITH NOLOCK と同等の READ UNCOMMITTED 分離レベルで実行されます。

また、SERIALIZABLE 分離レベルで実行されるより複雑な手順もあります。また、これらの同じ種類のチェックがたまたま含まれています。

そこで、チェック コードを複製する代わりに、これらの複雑なプロシージャ内からこれらのチェック プロシージャを呼び出すことにしました。

基本的には次のようになります。

そんなことしていいの?一時的にアクティブ化された低い分離レベルは、何らかの形で高いレベルの保護を破りますか、それともすべてが完全に安全ですか?

編集:実行はエラーなしでスムーズに進みます。

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

sql - Microsoft.Practices.EnterpriseLibrary の既定の分離レベルを設定する

Microsoft.Practices.EnterpriseLibrary を使用して、何千もの異なるストアド プロシージャを呼び出す .net 3.5 Web サイトがあります。

多くのタイムアウトが発生しており、いくつかのプレイとテストの後、ストアド プロシージャのテーブル ジョインの最後で (nolock) を使用すると、非常にうまく機能し、タイムアウトが減少します。

これをすべてのspsに実行したいと思います。すべてのテーブル名に (nolock) を追加することもできますが、SQL で "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" を使用して分離レベルを設定することをお勧めします。

これをすべてのspの最初に追加したくないので(非常に多いため)、接続に追加する方法を探していました。

sp を呼び出すコードの例は次のとおりです。

この設定は web.config の構成設定であると考えていますが、それが何であるか、または正しい軌道に乗っているかどうかはわかりません。

どんな助けでも本当に感謝しています。

乾杯アムジド

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

sql-server - Crystal Reports with SQL Server 2005: トランザクション分離レベルの設定

Crystal Reports が SQL Server 2005 データベースを照会するときに、次のいずれにも頼らずにトランザクション分離レベルを指定する方法はありますか?

  • SET TRANSACTION ISOLATION LEVEL...クエリ自体の前に実行されるストアド プロシージャにレポートのクエリをカプセル化する
  • Crystal Reports で SQL クエリを手書きして実行するSET TRANSACTION ISOLATION LEVEL...
0 投票する
2 に答える
434 参照

php - クリティカル セクションを達成するために PHP でロックする - MySQL での予期しない結果

目標は、一度に 1 つのスレッド/プロセスによってのみ実行できるコードの特定のセクションを含む PHP スクリプトを作成することです。

いくつかの制限:

  • 私のシステムではセマフォが利用できません
  • マニュアルには、マルチスレッド サーバーでは flock() を使用できないと記載されているため、flock() は廃止されました。(これを確認した)

そのため、MySQL を同期に使用することは可能であると考えていましたが (なぜでしょうか?)、予期しない結果が得られています。

テストするために、スクリプト test.php で 2 つのブラウザー タブを開きます。

表は次のとおりです。

最初のブラウザー タブに移動し、スクリプトにアクセスします。5 秒待ってから、別のタブに移動してスクリプトにアクセスし、両方のスクリプトが並行して実行されるようにします。最初のタブが待機することを期待しており、2 番目のタブは最初のクエリの後に終了する必要があります。ただし、両方のタブが sleep() 行で待機します。これは、最初のクエリが常に 'NOT_RUNNING' を返すことを意味します。

いくつかの奇妙なこと:

  • 上記の実験を繰り返すと、両方のタブを FireFox で実行し、次に 3 番目の異なるブラウザー タイプ (たとえば Chrome) で実行すると、うまくいきます。(ステータスはスリープ中に RUNNING に設定され、ステータスが RUNNING の場合、スクリプトは早期に終了します)
  • 2 つの異なるコマンド ライン ウィンドウを使用して上記の実験を繰り返し、コマンド ラインからスクリプトを実行すると、機能します。
  • 待機中にphpMyAdminをチェックすると、ステータスが正しく更新されます。

テーブルのロック、トランザクション、SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED、SET autocommit = 1;、すべてを試しましたが、常に同じ結果が得られました。

ここで何が起こっているか知っている人はいますか?この問題の良い解決策はありますか?

テスト済みのシステム: - Win、MySQL 5.0、php 5.3 - Linux、MySQL 5.0.91-community-log、php 5.2.12

ここで完全に立ち往生しています。見てくれてありがとう!


アップデート:

回答を送信していただきありがとうございます。まだこの問題を解決できません。提案されている GET_LOCK() と session_write_close() を使用したコードを次に示します。行レベルのロック、トランザクション、およびさまざまな分離レベルも試しました。もしかして出来ないのでしょうか?

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

nhibernate - Nhibernate:挿入ステートメントを生成してから更新ステートメントを生成します。マルチスレッド環境ではデッドロックの問題が発生します

SQL Server 2005でNHibernateを使用すると、次のシナリオが発生しました。

次の手順を含むビジネスプロセスがあります。

  1. トランザクションを開始します
  2. nhibernateマップオブジェクトを作成する
  3. nhibernateマップされたオブジェクトを保存します
  4. 他のビジネスワークフローステップを実行する
  5. ステップ2でnhibernateマップされたオブジェクトを更新します
  6. トランザクションをコミットする

シングルスレッド環境では、これは正常に機能します。ただし、別々のエンティティで同じユースケースを実行するマルチスレッド負荷テストを実行すると、いくつかのデッドロックが発生したことがわかりました。トランザクション分離レベルは、読み取りコミットのデフォルト設定のままにしました。

調査したところ、問題の原因は、nhibernateがステップ2で作成され、ステップ5で更新されたエンティティの挿入と更新ステートメントを発行することであることがわかりました。さらにテストすると、更新ステートメントがテーブル全体をロックしているのではなく、行だけが更新されると、別のスレッドが挿入または更新のためにテーブルにアクセスしようとすると、デッドロックが発生します。

Q1:nhibernateを取得して、更新している行をロックすることはできますか?つまり、更新を発行するときに行ロックを適用することはできますか?

まだ、挿入してから更新するステートメントではなく、単一の挿入ステートメントを実行するようにnhibernateを取得する方法を見つけていません。

Q2:この動作を変更するための構成オプションを知っている人はいますか?

SQL Serverデータベースでスナップショット分離をオンにし、トランザクション分離レベルをスナップショットに設定することで、マルチスレッド負荷テストで発生するデッドロックの問題を克服することができました。

誰かが同様の問題を経験したかどうか聞いてみたいです。

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

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は、このタスクのビジネス要件と完全に連携します。他の分離レベルもこのコードでは機能しないため、問題は他の分離レベルについても同様である可能性があります。

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

database - 書き込みのためにDBテーブルまたは行の範囲をロックする方法は?

主キーを持つ単純なテーブルがあります。読み取り操作のほとんどは、キーの正確な値によって 1 つの行をフェッチします。

各行のデータは、キーの順序でその前後の行と何らかの関係を維持しています。したがって、新しい行を挿入するときは、間に入る2行を読み取り、計算を行ってから挿入する必要があります。

懸念事項は、明らかに、別の接続が同じ間隔でキー値を持つ行を同時に追加する可能性があることです。2 番目の挿入が失敗するのとまったく同じキーの値である場合はカバーされますが、キーの値が異なるが同じ間隔である場合、関係が壊れる可能性があります。

解決策は、新しい行を追加することを決定したときに書き込み用にテーブル全体をロックするか、(可能であれば、疑わしい) キー値の間隔をロックすることです。それでも、その時点で読み取り専用トランザクションがブロックされないようにしたいと思います。

クライアント プログラムと IBM DB2 フリー エディションで C++ 用の libodbc++ ラッパーを使用して ODBC を使用しています (ただし、DB の選択は変更される可能性があります)。これは私がやろうと思ったことです:

  • 自動コミットとデフォルトの分離モードで接続を開始します
  • 新しい行を追加する必要がある場合は、auto-commit を false に設定し、分離モードを serialized に設定します
  • 新しいキー値の前後の行を読み取る
  • 新しい行を計算して挿入する
  • 専念
  • 自動コミットとデフォルトの分離モードに戻る

これは仕事をしますか?他のトランザクションは同時に読み取ることができますか? それを行う他の/より良い方法はありますか?

ところで、libodbc++ i/fa で読み取り専用トランザクションを指定する方法がわかりません。odbcで可能ですか?

編集:非常に有用な回答をありがとう、私は1つを選択するのに苦労しました.