Mysqlのクリアランスロックおよび発生原因

2649 ワード

ギャップロックとは、等しい条件ではなく範囲条件でデータを取得し、共有または排他ロックを要求すると、InnoDBは条件を満たす既存のデータレコードのインデックス項目にロックをかけます.キー値が条件範囲内にあるが存在しない記録を「ギャップ(GAP)」と呼び、InnoDBもこの「ギャップ」にロックをかけ、このロックメカニズムがいわゆるギャップロック(NEXT-KEY)ロックである.Query実行中に範囲を検索すると、このキー値が存在しなくても、範囲内のすべてのインデックスキー値をロックします.ギャップロックには、範囲キー値をロックすると、存在しないキー値が無実にロックされ、ロック時にロック値範囲内のデータが挿入されず、シーンによっては大きな危害を及ぼす可能性があるという致命的な弱点があります.
の準備を
DROP TABLE IF EXISTS `innodb_lock`;
CREATE TABLE `innodb_lock` (
  `a` int(10) NOT NULL,
  `b` varchar(255) NOT NULL DEFAULT '',
  KEY `index_a` (`a`),
  KEY `index_b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of innodb_lock
-- ----------------------------
INSERT INTO `innodb_lock` VALUES ('1', 'b2');
INSERT INTO `innodb_lock` VALUES ('3', '3');
INSERT INTO `innodb_lock` VALUES ('4', '4000');
INSERT INTO `innodb_lock` VALUES ('5', '5000');
INSERT INTO `innodb_lock` VALUES ('6', '6000');
INSERT INTO `innodb_lock` VALUES ('7', '7000');
INSERT INTO `innodb_lock` VALUES ('8', '8000');
INSERT INTO `innodb_lock` VALUES ('9', '9000');
INSERT INTO `innodb_lock` VALUES ('1', 'b1');
MySQL [test_db]> select * from innodb_lock;
+---+------+
| a | b    |
+---+------+
| 1 | b2   |
| 3 | 3    |
| 4 | 4000 |
| 5 | 5000 |
| 6 | 6000 |
| 7 | 7000 |
| 8 | 8000 |
| 9 | 9000 |
| 1 | b1   |
+---+------+

注意表のデータ、aはint型で、idを表すと、1,3,4,5,6,6を含む...もちろん2が欠けていて、連続していません.一般的に会社でクラウドコンピューティングのビッグデータ分析をするのは連続したほうがいいです.ある会社のデータは貴重かもしれません.削除とは論理削除で、状態変更をしただけです.
操作(2つのMysql端末を開き、autocommitの自動コミットを0に設定します.つまり、自動コミット機能をオフにします.トランザクション独立性レベルは繰り返し読み取り可能です.)
最初の端末でupdate操作を実行し、成功しました
MySQL [test_db]> update innodb_lock set b = '1234' where a > 1 and a < 6; //    1,3,4,5        。      2

2番目の端末でinsert操作を実行すると、ブロックされていることがわかります
MySQL [test_db]> insert into innodb_lock values (2,'2000');

反省:InnoDBの行レベルロックでは、2つの異なる端末が異なる行データを操作し、ブロックをもたらすことはありません.この文章を見て詳しく知ることができるhttp://www.cnblogs.com/wt645631686/p/8323963.html.しかし、渋滞が現れた.
次に、第1の端末がcommitコミットを実行した後、第2の端末も実行に成功し、第2の端末もcommitコミットしたことが分かった.テーブル・データを問合せ、データの変化を観察します.
MySQL [test_db]> select * from innodb_lock;
+---+------+
| a | b    |
+---+------+
| 1 | b2   |
| 3 | 1234 |
| 4 | 1234 |
| 5 | 1234 |
| 6 | 6000 |
| 7 | 7000 |
| 8 | 8000 |
| 9 | 9000 |
| 1 | b1   |
| 2 | 2000 |
+---+------+

最初の紹介とケース操作を通じて、つまりMysqlは間違いなく殺しても見逃さない、どうでもいい、あるなら見逃さない、与えられた範囲さえあれば、すべてロックした.