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

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