1.同時アクセス制御実装されている同時アクセス制御テクノロジはロックに基づいています。 ロックは、テーブル レベルのロックと行レベルのロックに分けられます。MyISAM ストレージ エンジンは行レベルのロックをサポートしていませんが、InnoDB はテーブル レベルのロックと行レベルのロックをサポートしています。 ロックは読み取りロックと書き込みロックに分類されます。読み取りロックは共有ロックとも呼ばれます。読み取りロックが追加されると、他の人も読み取りが可能になります。書き込みロックは排他ロックまたは排他ロックとも呼ばれます。書き込みロックは他の読み取りおよび書き込み操作をブロックします。 ロックは暗黙的ロックと明示的ロックに分けられます。暗黙的ロックはストレージ エンジンによって管理され、明示的ロックはユーザーが手動で追加します。 ロック戦略: ロックの粒度とデータ セキュリティの間のバランス メカニズム。 明示的なロックの使用方法: LOCK TABLES tbl_name READ|WRITE MariaDB [school]> LOCK TABLES students READ; #読み取りロックを追加 MariaDB [school]> テーブルのロック解除; #ロック解除
FLUSH TABLES tb_name : 開いているテーブルを閉じます(クエリキャッシュをクリアします)。通常はバックアップの前にグローバル読み取りロックを追加します。 SELECT句[FOR UPDATE | LOCK IN SHARE MODE]はクエリ中に書き込みまたは読み取りロックを追加します。 2. 取引アトミックSQL文のセット、または独立した作業単位 1. トランザクションは ACID 原則に従います。
2. トランザクションライフサイクル明示的なトランザクション: トランザクションの開始を明確に指定する 暗黙的なトランザクション: デフォルトは暗黙的なトランザクションで、各ステートメントが実行された後に直接コミットされます。 autocommit = {OFF|ON} は自動コミットをオンまたはオフにします。「自動コミット」機能を使用する代わりに、トランザクションを明示的に要求してコミットすることをお勧めします。 トランザクションを開始します: タグを挿入: 指定されたタグにロールバックします: すべて元に戻す: トランザクションをコミットします: タグを削除: MariaDB [school]> START TRANSACTION; #トランザクションの開始を明示的に指定しますMariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (26,'Tom',22,'M'); #レコードを追加しますMariaDB [school]> SAVEPOINT sp26; #ラベルを挿入しますMariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (27,'Maria',12,'F'); #別のレコードを追加しますMariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #確認すると、挿入されたデータが表示されます+-------+-------+--------+---------+----------+-----------+-----------+ | 生徒ID | 名前 | 年齢 | 性別 | クラスID | 教師ID | +-------+-------+------+---------+----------+-----------+ | 26 | トム | 22 | 男性 | NULL | NULL | | 27 | マリア | 12 | F | NULL | NULL | +-------+-------+------+---------+----------+-----------+ MariaDB [school]> ROLLBACK TO sp26; #sp26 タグより前の状態に戻す MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #チェック、maria の情報は取り消されました+-------+------+-------+---------+----------+-----------+ | 生徒ID | 名前 | 年齢 | 性別 | クラスID | 教師ID | +-------+------+------+--------+----------+-----------+ | 26 | トム | 22 | 男性 | NULL | NULL | +-------+------+------+--------+----------+-----------+ MariaDB [school]> COMMIT; #トランザクションをコミット MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #最終データ+-------+------+------+---------+----------+-----------+ | 生徒ID | 名前 | 年齢 | 性別 | クラスID | 教師ID | +-------+------+------+--------+----------+-----------+ | 26 | トム | 22 | 男性 | NULL | NULL | +-------+------+------+--------+----------+-----------+ 3. トランザクション分離レベル
MVCC: トランザクションレベルに関連するマルチバージョン同時実行制御 トランザクション分離レベルを変更します。サーバー変数 tx_isolation で指定します。デフォルトは REPEATABLE-READ で、GLOBAL レベルと SESSION レベルで設定できます。
MariaDB [school]> SELECT @@tx_isolation; #デフォルトは繰り返し読み取りレベルです+-----------------+ | @@tx_isolation | +-----------------+ | 繰り返し読み取り | +-----------------+ MariaDB [学校]> tx_isolation='READ-UNCOMMITTED' を設定します。 MariaDB [school]> tx_isolation='READ-COMMITTED' を設定します。 MariaDB [school]> tx_isolation='REPEATABLE-READ' を設定します。 MariaDB [school]> tx_isolation='SERIALIZABLE' を設定します。 4. 行き詰まり2 つ以上のトランザクションが同じリソースを占有し、お互いが占有しているリソースのロックを要求すると、デッドロックが発生します。 トランザクション A がテーブル t1 の 3 行目を変更し、トランザクション B がテーブル t2 の 2 行目を変更すると、トランザクション A はテーブル t2 の 2 行目を変更するときにブロックされます。次に、トランザクション B はテーブル t1 の 3 行目を変更するときにブロックされ、デッドロックが発生します。 2 つのトランザクションが同時に互いの変更済みテーブルを変更しようとして、互いをブロックします。システムはデッドロックを検出し、デッドロックを解決するために低コストのトランザクションを自動的に犠牲にします。
プロセス リストを表示します: プロセスを終了します: これで、MySQL シリーズ 10: MySQL トランザクション分離による同時実行制御の実装に関する記事は終了です。MySQL 同時実行制御の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 これで、MySQL シリーズ 10: MySQL トランザクション分離による同時実行制御の実装に関する記事は終了です。MySQL 同時実行制御の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: HTML で複数のクラス属性を定義する場合の無効な解決策
最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か...
この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常...
1. まず、お使いのマシンに応じて、MySQL 公式サイトから対応するデータベースをダウンロードしま...
この記事では主に、リクエストを転送したり、静的リソース ファイルにアクセスしたりする nginx の...
今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...
DOCTYPE 宣言 作成するすべてのページの先頭に、ドキュメント宣言が必要です。はい、そうでしょう...
単一のテーブルを削除する: tableName から columnName = value を削除し...
in() の ID の順序に従った Mysql クエリ結果の順序の詳細な説明コード例: <se...
マイグレーションアドバンテージ:小型、高速、総所有コストが低い、オープンソース。複数のオペレーティン...
Swarm クラスター管理導入Docker Swarm は Docker 用のクラスター管理ツールで...
開発中に、非常に単純なテキストバブル効果に遭遇しました。これは、おおよそ次のようになります。 うーん...
nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー、メール プ...
目次なぜ Docker が必要なのでしょうか? Docker デプロイメントの例コードの準備Dock...
MySQL 基本データ型一般的な MySQL データ型の概要 ![1036857-201708011...
参考までに、Javascript を使用して広告を閉じる方法に関するケース スタディを示します。詳細...