1

また同じ質問でしたらすみません。データベースのロックに関する情報を見つけようとしましたが、ついに混乱しました。私はSyabse ASEを使用しており、次のことを実行しました

3 つの端末から sybase に接続し、各接続からトランザクションを開始しました。

トランザクション T1、T2、T3。

T1 と T2 は、以下を使用して共有ロックを取得します。

共有モードでのロック テーブル サンプル

T1 と T2 が選択操作を実行している

T3 が来て、排他ロックが必要なサンプル テーブルを更新しようとします。使用して以来

ロック待機を設定 60

T3 の更新ステートメントは 60 秒後に強制終了されます。

ここで、T1 は、排他ロックが必要なサンプル テーブルを更新しようとします。T2 もサンプル テーブルの共有ロックを保持しているため、T1 が保持されます。T1 には待機タイムアウトがないため、T2 がトランザクションをコミットするまで無期限に待機します。

ここで、T2 は、排他ロックが必要なサンプル テーブルの更新も試みます。T1 もサンプル テーブルの共有ロックを保持しているため、sybase はデッド ロックを検出し、T2 の更新ステートメントを強制終了してから、T1 の更新ステートメントが正常に実行されます。

最初に更新を要求したトランザクションが正常に完了し、他のトランザクションのステートメントが sybase によって強制終了されると仮定します。

ここで、T2 は再びサンプル テーブルの更新を試みます。T2 は無期限に保留されます。

ここで、T1 は再びサンプル テーブルの更新を試みます。今度は T1 の update ステートメントが正常に終了し、T2 はまだ待機しています。

これが私が混乱したところです。

T2 が最初に更新を要求しました。今度は、デッドロックがある場合、T1 を強制終了する必要があります。

T1 が最初にテーブルを更新したときに、サンプル テーブルの排他ロックを自動的に取得したと仮定します。

トランザクションのロックを自動的に変更できますか?

その後、T1 からの選択を実行したところ、問題なく動作しました。排他ロックが解除され、共有に変更されると仮定します。

次にT1からアップデートを実行しました。T1 は再び終了し、T2 はまだ待機中です。

T1 で明示的にロックを共有に変更する必要がありますか?

これは私がしました。を使用してロックを共有に変更してみました

共有モードでのロック テーブル サンプル

そしたらこんなメッセージが来ました

データベース 'shmdb' のテーブル 'sample' は、'shared' モードでカバリング ロックが見つかったため、'shared' モードでロックされませんでした。

T2のステータスを確認しました。まだ待っています。

次に、T1 からサンプル テーブルを更新しようとしましたが、正常に実行され、T2 はまだ待機しています。

混乱しすぎ。

T1 のロックを変更するにはどうすればよいですか? トランザクションをコミットするとロックが解放され、T2 は正常に実行されます。

これが唯一可能な方法ですか?

4

1 に答える 1

0

トランザクション T2 がテーブルを更新しようとしている間、T1 は既にテーブルの共有ロックを保持していると思います。T2 は、T1 が保持している共有ロックまたは排他ロックを解放するまで更新できません。

トランザクション T1 がロックを保持するまで、何度でもテーブルを更新できます。

はい..あなたは正しいコミットまたはロールバックのみがテーブルのロックを解放します。

デッドロックを最小限に抑える他の方法は、テーブルの行レベル ロックを維持することです。これにより、他のトランザクションで使用されていないテーブルの他の行を更新できます。

于 2013-08-30T12:30:38.457 に答える