問題タブ [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 に答える
4873 参照

sql - SQLサーバーの単純なクエリは、トランザクションの分離レベルが原因で実行に永遠に時間がかかります.

SQL サーバーでトランザクションの分離レベルを学習しているときに、問題に遭遇しました。

問題は、このコードを実行した後 (そしてエラーなしで終了した後):

このクエリを実行したい:

しかし、「クエリを実行しています」と表示されるだけで、何もしません。最初のトランザクションが終了した後も、テーブルのロックが何らかの形で継続しているためだと思います。誰か助けてくれませんか?もちろん、選択と挿入は同じテーブルを参照します。

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

postgresql - PostgreSQL トランザクション分離を永続的に設定する

将来のすべてのセッションでトランザクション分離レベルを永続的に設定したいのですが、セッションでのみそれを行う方法SERIALIZABLEしかわかりません。

これが可能な場合、どのように行うことができますか?

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

sql - SQL ServerでのみUNCOMMITTED行を選択する方法は?

ライブ CRM システムにクエリを実行する必要がある DW プロジェクトに取り組んでいます。標準分離レベルは、パフォーマンスに悪影響を及ぼします。ロックなし/トランザクション分離レベルのコミットされていない読み取りを使用したくなります。選択した行のうち、ダーティ リードによって識別される行の数を知りたいです。

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

sql-server - MS SQL Server では、ReadCommitted の場合、トランザクション中に読み取りロックを解除するにはどうすればよいですか?

MS SQL Server 2008 でトランザクションを開始し、テーブル レコードを更新すると、トランザクションをコミットしない限り、SQL サーバーは他のユーザーがそのレコードを読み取れないようにロックします (Isolation level = Read Committed の場合)。

トランザクション中およびコミットする前に、他のユーザーが元の値を読み取れないようにするにはどうすればよいですか (ReadCommitted の場合)。

例: 個人テーブルでトランザクションを開始し、個人名を「Alex1」から「Alex2」に更新すると、Readcommitted 分離レベルの場合、トランザクションをコミットしない限り、他のユーザーはレコードを読み取ることができません! それで、トランザクション中に他のユーザーが元の値「Alex1」を読み取れないようにするにはどうすればよいですか(コミットされていない値を読み取らせたくありません)。コミットすると、コミットされた値である「Alex2」を読み取ることができます"?

ありがとう、

0 投票する
0 に答える
64 参照

sql - SQL 部分的にシリアライズ可能

私たちが解決しようとしている高レベルの問題は、ユーザーが開始した ETL プロセスからレコードが重複するのを防ぐことです。これは、インポートする行ごとにプロシージャを呼び出します (これは簡略化のためであり、設計の変更は私の計画の一部ではありません)。質問)。したがって、基本的には次のようになります (テーブルには約 20 列あることに注意してください)。

手順 ImportRow ( @p1、@p2、@p3 など)

存在しない場合 ( TargetTable から
1を選択 WHERE col1 = @p1 AND col2 = @p2 AND col3 = @p3 など)

INSERT INTO TargetTable(col1, col2, col3...)
VALUES (@p1, @p2, @p3)

したがって、2 人のユーザーが誤って同じインポーターを同時に実行すると、レコードが重複してしまうという競合状態が発生することは明らかです。

2番目のトランザクションが挿入を実行するのを防ぐために、喜んで使用SERIALIZABLEします...IF NOT EXISTS

手順 ImportRow ( @p1、@p2、@p3 など)

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

存在しない場合 (TargetTable から
1を選択
(UPDLOCK)
WHERE col1 = @p1 AND col2 = @p2 AND col3 = @p3 など)

INSERT INTO TargetTable(col1, col2, col3...)
VALUES (@p1, @p2, @p3)

...しかし、ご存知のように、インデックスをカバーしないと、テーブル全体がロックされます...

...そして、20 列あるため、カバリング インデックスを追加できません。

ただし、最初の 2 つのパラメーター/列は基本的に「インポーター ID」と「現在の日付」であるため、実際にはそれのみをシリアル化しても問題ありません。つまり、同じインポーターが複数回実行されるのを防ぎます。つまり、ロックの粒度が「テーブル全体」と「行ごと」の間になるようにします。このようなもの:

手順 ImportRow ( @importer、@asOfDate、@p3、@p4、@p5 など)

-- インポーターをロックダウン
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT 1
FROM TargetTable (UPDLOCK)
WHERE importer = @importer AND asOfDate = @asOfDate

存在しない場合 (TargetTable から
1を選択
(UPDLOCK)
WHERE importer = @importer AND asOfDate = @asOfDate AND col3 = @p3 AND col4 = @p4 AND col5 = @p5 など)

INSERT INTO TargetTable(インポーター、asOfDate、col3、col4、col5...)
値 (@importer、@asOfDate、@p3、@p4、@p5)

importer と asOfDate にはカバー インデックスがあるので、それだけを serializable でロックダウンし、残りのテーブルは自由で明確にする必要があります。SELECT問題は、最初のクエリから明らかに遅くて醜い結果セットが生成されることです。

この「部分的なシリアライズ可能」を行う別の方法はありますか? 一時テーブルを燃やそうと思っていたのですが、もったいないです。

SELECT 1
INTO #Ignored FROM TargetTable (UPDLOCK)
WHERE importer = @importer AND asOfDate = @asOfDate

私が考えることができる他の唯一のことは、別のテーブルに importer/asOfDate を配置し、そのペアに id ('importerDateId') を与えてから、TargetTable でその importerDateId を使用することです。つまり、もう少し正規化しますが、スキーマの変更を避けたい。

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

java - hibernate 4でカスタムスレッドセーフシーケンスを実装するには?

種類は異なるが同じタイプ (同じクラス、同じテーブル) のオブジェクトのシリアル番号を生成するソリューションを実装する必要があります。さらに、シリアル生成のルールは実行時に定義されます (開始シリアル、最大数など)。私は MySQL を使用していますが、休止状態の MySQL5Dialect はシーケンス生成をサポートしていないため、各行が異なる種類のオブジェクトのシーケンスであるシーケンス テーブルを使用してこの機能を実装することにしました。

値をインクリメントするdaoを作成しました:

そして、これはサービス層から次のように呼び出されます。

私はすべてを試しました: 分離レベルをIsolation.SERIALIZABLEに設定し、プログラムでメソッド内のトランザクションをコミットし、それにsynchronizedキーワードを追加し、ロック要求も追加しましたが、分離レベルが既に設定されているため、廃止されたと思います。

それでも、100 個のスレッドを作成し、それぞれからこのメソッドを 60 回呼び出すと、nextVal列の値は 6000 ではなく約 4000 になります。

ここで非常に基本的なことが欠けていると思われますが、これが期待どおりに機能するために必要なものを見つけることができません。

ヒントをありがとう!

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

mysql - mysql のトランザクション分離とは何ですか? 詳細な説明が必要です

私はそれについていくつかの研究を開始しているので、mysql でのトランザクション分離とは何か、そしてその利点を教えてください。これはそれについて取得するものです