1. データベースはどのようにロックされますか? 単純な SQL ステートメント
SELECT username
,passwd
FROM g_test
LIMIT 1 FOR UPDATE
通常のクエリの後に FOR UPDATE を追加すると、データベースがロックされますか?
2. FOR UPDATE ロック書き込みを追加すると、このステートメントは DELETE に有効になりますか?
3. MYISAM はテーブル全体をロックしていますか?
4.InnoDB は行ロックですか?
新しい質問
5. データベースがトランザクションを開いてロックを追加したが、何らかの理由で後続の操作が完全に完了せず、コミットもロールバックも行われない場合、トランザクションにタイムアウト メカニズムはありますか?ロックにはタイムアウト機構がありますか?期限切れになると自動的に破棄されます
1. データベースはどのようにロックされますか? 単純な SQL ステートメント
SELECT username
,passwd
FROM g_test
LIMIT 1 FOR UPDATE
通常のクエリの後に FOR UPDATE を追加すると、データベースがロックされますか?
2. FOR UPDATE ロック書き込みを追加すると、このステートメントは DELETE に有効になりますか?
3. MYISAM はテーブル全体をロックしていますか?
4.InnoDB は行ロックですか?
新しい質問
5. データベースがトランザクションを開いてロックを追加したが、何らかの理由で後続の操作が完全に完了せず、コミットもロールバックも行われない場合、トランザクションにタイムアウト メカニズムはありますか?ロックにはタイムアウト機構がありますか?期限切れになると自動的に破棄されます
他の回答者が言ったことは十分に包括的ではないので、あなたのために整理させてください。
まず第一に、さまざまなデータベースメカニズム (特に MySQL などのプラグインストレージエンジンを備えたデータベース) について話す前に、使用するストレージエンジンを宣言する必要があると思います。そうしないと、ここでの質問は無意味であると仮定します。 , 2つの質問はinnoDBストレージエンジンに基づいており、私の理論もinnoDBエンジンに基づいています。
概念を明確にしてください。ロックには次の 2 種類があります:
読み取りロック -> 共有ロック (S)
書き込みロック -> 排他ロック (X)
書き込み操作の排他ロック、
理論的には、 、操作されたオブジェクト (id = 1 の行など) に排他ロックがある限り、この行を操作できるトランザクションを除き、他のトランザクションは、行が行であるかどうかに関係なく、この行に対して操作を実行する権利を持ちません。読み取り操作または書き込み操作
ちなみに、select .. for update は SQL 仕様に属さないので、実際には避けるべきです。
select ..for update は排他的ロック操作を実行しますが、このステートメントはトランザクション内でのみ意味を持ちます。非トランザクション状況で使用すると、ロック操作とロック解除操作が一度に完了し、実際的な意味はありません。もう 1 つの非常に重要な点は、innoDB は REPEATABLE READ および READ COMMITTED の分離レベルでのトランザクション操作で行レベルのロックを直接使用せず、代わりにオプティミスティック メカニズム MVCC を使用することです。つまり、ほとんどの読み取り操作はロックを必要としません。書き込みロックは必要な行のみをロックします 「MVCC について」
1.「更新用の g_test LIMIT 1 からのユーザー名、パスワードの選択」はロックされていますか?
はい、行レベルの排他ロックが追加されます。2.「更新の書き込みロックは削除ステートメントに対して有効ですか?」 さらに更新には書き込みロック(つまり排他ロック)があり、もちろん削除にも有効です(削除は操作できません)が、それでも上記の観点から、REPEATABLE READおよびREAD COMMITTEDのトランザクション操作ではMVCCが使用されますfor update exclusive lock ステートメントを使用した後でも、他のトランザクションが読み取り操作を実行できることに驚かれるかもしれません。
3.「MyISAM はテーブル全体をロックしていますか?」
はい、MyISAM ストレージ エンジンにはテーブル レベルのロックしかありません
4.「InnoDB は行レベルのロックですか?」
完全に正しくありません。innoDB には行レベルのロックとテーブルレベルのロックがありますが、デフォルトでは行レベルのロックになります。
トランザクション自体にはタイムアウト機構はありませんが、テーブルのロックによりトランザクションがタイムアウトした場合はロールバックされます。デフォルトの innodb ロック タイムアウトは 50 秒で、これは変数 innodb_lock_wait_timeout を設定することで実現されます。5.「トランザクションとロックにはタイムアウトメカニズムがありますか?」
MYISAM ロックはテーブル全体を対象とします。InnoDB ロックは 1 行のレコードを対象とした行ロックです。
SELECT username, passwd FROM g_test LIMIT 1 FOR UPDATE は、FOR UPDATE が追加された場合に複数のプロセスが同時に SQL クエリを実行することを防ぎます。 、ロックされるため、別のプロセスがキューに登録され、前のプロセスの実行が完了するまで待機します。つまり、同時実行です。最も重要な点は、ロックはトランザクション内、つまり SQL 実行の中に配置する必要があるということです。最初にトランザクションをオープンします。
InnoDB は 2 フェーズ ロック プロトコルを使用します。ロックはトランザクション実行中いつでも実行できます。ロックはコミットまたはロールバックが実行された場合にのみ解放され、すべてのロックが同時に解放されます。 InnoDB は、必要に応じて分離レベルに基づいて自動的にロックします。これは暗黙的なロックです。
InnoDB は特定のステートメントによる明示的なロックもサポートしています:
select ... 共有モードでのロック (共有ロック)
select ... 更新用 (排他的ロック)
さらに、MySQL はこれをサポートします。サーバー層 lock tables および unlock tables ステートメントは、ストレージ エンジンとは何の関係もありません。