問題タブ [database-concurrency]
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.
android-syncadapter - Android SyncAdapter と同時書き込みアクセス
SyncAdapter を使用して RESTful Android アプリを開発しています。いくつかのスクリーンキャストを見て、いくつかのチュートリアルを読みましたが、基本的なダイナミクスしか扱っていません。コードを書き始める前に、専門家のユーザーから並行性の問題についてフィードバックを受けたいと思います。
ステップ 1. ユーザーはデータベースのテーブルにU
新しいエントリを挿入します。エントリには列があります。E
T
status = TO_SYNC
ステップ 2. エントリE
が同期される前に、エントリU
を変更することを決定します。A
の列の値を変更するためのアクティビティが開始されますE
。
ステップ 3. ユーザーがエントリーを変更している間に、SyncAdapter が始動し、エントリーをstatus == TO_SYNC
サーバーに送信します。エントリごとに、サーバーから肯定的な応答を受け取ると、SyncAdapter
セットが設定されます。status = SYNCED
ステップ 4. 同じエントリへの同時アクセスE
によって競合が発生するとします。
- SyncAdapter は を読み取り、サーバー
E
に送信しますE
- アクティビティ
A
が完了し、E
ステータスがTO_SYNC
- SyncAdapter はサーバーから ok を受け取り、
status
ofE
をに設定します。SYNCED
- この時点では、値が SyncAdapter によって上書きされているため、新しい値は
E
同期されません。TO_SYNC
私の質問は、begin/end transaction
同期中にデータベース全体をブロックせずにこのような問題を回避するにはどうすればよいですか (完了するまでに時間がかかる可能性があります)。単一のエントリに対して従来の Java ロックを使用する必要がありますか? もっとエレガントな方法はありますか?
c# - 複数のスレッドからの Entity Framework エンティティの変更
ユーザーがエンティティの特定のプロパティを設定できるようにする UI スレッドがあります。
また、重要なことに、ユーザーがアクセスできないエンティティのプロパティを自動的に変更するワーカー スレッドもあります。
DbContexts
スレッドごとに異なるものを使用し、同じプロパティを常に変更しないようにプログラミングに依存してからSaveChanges()
、同じエンティティが異なる方法で変更されたコンテキストで試行することは安全でしょうか?
または、これを行うためのより安全な方法、つまり、同じプロパティが 2 つの異なるコンテキストから安全に変更されるようにプログラマーがいつかコードを変更できるようにする方法はありますか? それとも、この後者の状況は、単にプログラマーが注意/リファクタリングをしなければならない状況ですか?
sql-server - 多くのユーザーがデータベース内の同じテーブル (テーブルへの同時アクセス) を必要とする場合、危険ですか?
個人データをDBテーブルに入れることで各ユーザーにサービスを提供するサーバーのコードを使用します。多くのユーザーがいて、たとえばそのうちの 2 人が DB のテーブルにデータを入れたいと考えています。この場合、SQL サーバーはどのように機能しますか? このようなユーザーの動作 (テーブルへの同時アクセス) に備えたメカニズムはありますか? サーバーの機能は C# で記述されており、アクセスの試行ごとに SqlConnection.ConnectionString を使用します。
sql - SQLでグローバル一時テーブルを作成/削除するときに、ユーザー間でアクセスの競合はありますか?
複数のユーザーが実行することになっている SQL ストアド プロシージャがあります。すべてのユーザーは、同じサーバーと同じデータベースでこのプロシージャを実行します。実行中に、グローバル一時テーブルが作成され、最後に削除されます (たとえば、##temp_1
、##temp_2
など)。proc がグローバル一時テーブルを作成するとき、次のコードを使用します。
だから私の質問は、 と が作成されたときに、User A
別のマシンで開始し、彼の を作成し始めることです。上記のコードによると、存在する場合はデータベースから削除されます。この操作は に影響しますか? ユーザーが互いに影響し合っている場合、それを回避する方法はありますか?##temp_1
##temp_2
User B
##temp_1
##temp_1
User A
どうもありがとう。
mysql - SQL: データベースへの安全なアクセスと変更を同時に行う方法を理解しようとしている
だから、私は現在MySQLで作業していますが、一般的な概念を理解しようとしているので、SQLの答えはおそらくうまくいくでしょう。
そのため、並行環境ではスレッド セーフが明らかに重要です。私は主に Java でプログラミングを行っており、スレッドの競合を避けるために変更可能な状態を保護するコードを書くことには常に細心の注意を払っています。
ただし、SQL では、同じレベルの安全性を実現する方法について非常に混乱しています。ですから、わからないことから始めて、混乱していることに進み、そこから理解していきます。
まず、私が知っているのはトランザクションです。自動コミットを無効にし、セーブポイント、ロールバックなどを使用します。私が理解しているように、トランザクションはコミットの時点でアトミックです。
しかし、明示的なロック ステートメントや同時実行モデル (楽観的、悲観的) への言及も見てきました。また、すべてにトランザクションを使用して、それが安全であると仮定したくもありません。全体を理解しない限り、コードを書きません。何かを偶然に任せたくありません。
さらに、トリガー、プロシージャーなどについてはどうでしょうか。トランザクションでそれらを使用するにはどうすればよいですか? そこで原子性を確保するにはどうすればよいですか?
これは少し複雑すぎる気がしますが、複数のスレッドとユーザーがデータベースを安全に変更できるようにする方法について、包括的で明確な説明を探しています。私はそれよりもSQLをよく理解しているので、完全ではありません.ELI5ですが、プロセスを本当に完全に説明しているもの.
ありがとう。私の検索では、このサイトでこの質問に適切に一致するものは見つかりませんでしたが、重複している場合はお詫びし、この質問がロックされる前に適切な回答へのリンクを提供していただくようお願いします.