まったく同時にDB(SQLサーバー)に書き込む(トランザクションを開始する)n台のマシンがあります。分離レベルをシリアライズ可能に設定しています。私の理解では、どのマシンのトランザクションが最初に DB に到達しても実行され、これが完了するまで他のトランザクションはブロックされます。
あれは正しいですか?
まったく同時にDB(SQLサーバー)に書き込む(トランザクションを開始する)n台のマシンがあります。分離レベルをシリアライズ可能に設定しています。私の理解では、どのマシンのトランザクションが最初に DB に到達しても実行され、これが完了するまで他のトランザクションはブロックされます。
あれは正しいですか?
どちらのマシンのトランザクションが最初に DB に到達しても実行され、これが完了するまで他のトランザクションはブロックされます。
いいえ、これは間違っています。結果は、あたかも各トランザクションが次々に実行されたかのようになります (シリアル、したがって分離レベル名)。ただし、エンジンは、シリアライズ可能な分離モデルの保証を尊重する限り、好きな実装を自由に使用できます。そして、いくつかのエンジンは実際にあなたが説明したようにそれを実装しています。Redis トランザクション(ただし、Redis には「分離レベル」の概念はありません)。
SQL Server の場合、トランザクションはロックの競合が発生するまで並行して実行されます。競合が発生すると、ロックが付与されたトランザクションは影響を受けずに続行しますが、競合モードでロックを要求するトランザクションは、ロックが解放されるまで (付与されたトランザクションがコミットされるまで) 待機する必要があります。どのトランザクションがたまたまリクエストであり、どのトランザクションがたまたま許可されているかは、完全に実行される内容次第です。つまり、最初のマシンが待機している間に、2 番目のマシンが最初に許可を取得し、最初に終了する場合がよくあるということです。
シリアライズ可能な分離レベルでのロック動作の違いをよりよく理解するには、「キー範囲のロック」を参照してください。
それは異なります - それらはすべて同じ活動を行っていますか? つまり、フロー制御なしで、まったく同じステートメントが同じ順序で実行されますか?
そうでない場合、2 つの接続が DB 内の独立したオブジェクトにアクセスしている場合、それらは並行して実行できます。
リソースのオーバーラップがある場合は、複数の接続によって、そのうちの 1 つが別のロックを既に持っているロックを取得しようとするまで、ある程度の進行が行われる可能性があります。その時点で待機します。その場合、デッドロックの可能性があります。
ステートメントは、他のトランザクションによって変更されたがまだコミットされていないデータを読み取ることはできません。
現在のトランザクションが完了するまで、他のトランザクションは現在のトランザクションによって読み取られたデータを変更できません。
他のトランザクションは、現在のトランザクションが完了するまで、現在のトランザクションのステートメントによって読み取られるキーの範囲に入るキー値を持つ新しい行を挿入できません。
はい、これはどの分離レベルでも書き込み操作に当てはまります。
分離レベルは、これが行われている間にデータを読み取るときに何が起こるかを決定するのに役立ちます。シリアライズ可能な読み取り操作は、書き込み操作をブロックします。これは、必要な動作である可能性があります。