成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何真正來區分一下 不可重復讀和幻讀

數據庫 MySQL
雖然網上有不少資料提到幻讀, 但是可能表達的都不太準確, 比如這樣一段對幻讀的解釋 '同樣的條件, 第一次和第二次讀出來的記錄不一樣' 在網絡上隨處可見, 但其實并不準確, 因為 delete 其實并不是幻讀的范疇(MySQL官方文檔對 Phantom Rows 的介紹)也一點都沒涉及到delete)。

[[215809]]

幻讀 (間隙鎖)

1.由于很多人(當然也包括本人), 容易搞混 不可重復讀 和 幻讀 , 這兩者確實非常相似。

  • 但 不可重復讀 的重點是針對 update, delete。
  • 而 幻讀 的重點針對的是 insert。(可以參考MySQL官方文檔對 Phantom Rows 的介紹)

2.雖然網上有不少資料提到幻讀, 但是可能表達的都不太準確, 比如這樣一段對幻讀的解釋 '同樣的條件, ***次和第二次讀出來的記錄不一樣' 在網絡上隨處可見, 但其實并不準確, 因為 delete 其實并不是幻讀的范疇(MySQL官方文檔對 Phantom Rows 的介紹)也一點都沒涉及到delete)。

3.如果手動加鎖來演示, 你便會看清他們的本質:

  • 如果 insert, 則操作被阻塞, 并且可以看到具體加的是X鎖+GAP鎖:

  • 如果 delete或者update, 則操作被阻塞, 但是可以看到具體加的只有X鎖:

可以看到, 其他事務只有在 insert 的時候, 才會加GAP鎖來防止幻讀, 所以delete/update 和 insert 是要區分開的.

不過, 后面學到mvcc的時候, 你會知道加鎖的低效性, 所以還有兩種解決方案:

使用隔離性的***隔離級別SERIALIZABLE, 但該隔離級別在實際中很少使用;

其實 REPEATABLE READ 就可以防止幻讀, 《高性能MySQL》中也說了, REPEATABLE READ 理論是是不能防止幻讀的, 但是由于該隔離級別還使用了MVCC, 可以做到非鎖定一致性讀取, 所以, 只要你真的確定你明白幻讀的意思, 你在 REPEATABLE READ隔離級別下是模擬不出幻讀效果的;

至于網絡上如下所謂的幻讀現象, 本人覺得是誤導, 剛開始本人也認為這就是REPEATABLE-READ隔離級別無法解決幻讀的鐵證, 后來發現錯了, 幻讀是指兩次讀操作發現記錄增多導致的不一致, 而如下是多次insert, 雖然也是個問題, 但已經不是 幻讀 問題了:

打開客戶端1查看隔離級別及初始數據

  1. mysql> SELECT @@SESSION.tx_isolation; 
  2. +------------------------+ 
  3. | @@SESSION.tx_isolation | 
  4. +------------------------+ 
  5. REPEATABLE-READ        | 
  6. +------------------------+ 
  7. 1 row in set (0.00 sec) 
  8.   
  9. mysql> select * from test_transaction; 
  10. +----+-----------+-----+--------+--------------------+ 
  11. | id | user_name | age | gender | desctiption        | 
  12. +----+-----------+-----+--------+--------------------+ 
  13. |  1 | 金剛狼 | 127 |      1 | 我有一雙鐵爪 | 
  14. |  2 | 鋼鐵俠 | 120 |      1 | 我有一身鐵甲 | 
  15. |  3 | 綠巨人 |   0 |      2 | 我有一身肉    | 
  16. +----+-----------+-----+--------+--------------------+ 
  17. rows in set (0.00 sec) 
  18.   
  19. mysql>  
  • 打開客戶端2查看隔離級別及初始數據
  1. mysql> SELECT @@SESSION.tx_isolation; 
  2. +------------------------+ 
  3. | @@SESSION.tx_isolation | 
  4. +------------------------+ 
  5. REPEATABLE-READ        | 
  6. +------------------------+ 
  7. 1 row in set (0.00 sec) 
  8.   
  9. mysql> select * from test_transaction; 
  10. +----+-----------+-----+--------+--------------------+ 
  11. | id | user_name | age | gender | desctiption        | 
  12. +----+-----------+-----+--------+--------------------+ 
  13. |  1 | 金剛狼 | 127 |      1 | 我有一雙鐵爪 | 
  14. |  2 | 鋼鐵俠 | 120 |      1 | 我有一身鐵甲 | 
  15. |  3 | 綠巨人 |   0 |      2 | 我有一身肉    | 
  16. +----+-----------+-----+--------+--------------------+ 
  17. rows in set (0.00 sec) 
  18.   
  19. mysql>  

在客戶端2中開啟事務, 然后查詢數據

  1. mysql> begin
  2. Query OK, 0 rows affected (0.00 sec) 
  3.   
  4. mysql> select * from test_transaction; 
  5. +----+-----------+-----+--------+--------------------+ 
  6. | id | user_name | age | gender | desctiption        | 
  7. +----+-----------+-----+--------+--------------------+ 
  8. |  1 | 金剛狼 | 127 |      1 | 我有一雙鐵爪 | 
  9. |  2 | 鋼鐵俠 | 120 |      1 | 我有一身鐵甲 | 
  10. |  3 | 綠巨人 |   0 |      2 | 我有一身肉    | 
  11. +----+-----------+-----+--------+--------------------+ 
  12. rows in set (0.00 sec) 
  13.   
  14. mysql>  

在客戶端1中插入一條id為4的新數據 (直接自動提交)

  1. mysql> insert into test_transaction (`id`,`user_name`,`age`,`gender`,`desctiption`) values (4, '死侍', 18, 0, 'A bad boy'); 
  2. Query OK, 1 row affected (0.00 sec) 
  3. mysql> select * from test_transaction; 
  4. +----+-----------+-----+--------+--------------------+ 
  5. | id | user_name | age | gender | desctiption        | 
  6. +----+-----------+-----+--------+--------------------+ 
  7. |  1 | 金剛狼 | 127 |      1 | 我有一雙鐵爪 | 
  8. |  2 | 鋼鐵俠 | 120 |      1 | 我有一身鐵甲 | 
  9. |  3 | 綠巨人 |   0 |      2 | 我有一身肉    | 
  10. |  4 | 死侍    |  18 |      0 | A bad boy          | 
  11. +----+-----------+-----+--------+--------------------+ 
  12. rows in set (0.00 sec) 
  13.   
  14. mysql>  

在客戶端2事務中再次查詢數據, 發現數據沒有變化(表示可以重復讀, 并且克服了幻讀), 但是在客戶端2事務中插入一條id為4的新數據, 發現提示數據已經存在, 注意, 雖然爆出問題來了, 但不是 幻讀 范疇

  1. mysql> begin
  2. Query OK, 0 rows affected (0.00 sec) 
  3.   
  4. mysql> select * from test_transaction; 
  5. +----+-----------+-----+--------+--------------------+ 
  6. | id | user_name | age | gender | desctiption        | 
  7. +----+-----------+-----+--------+--------------------+ 
  8. |  1 | 金剛狼 | 127 |      1 | 我有一雙鐵爪 | 
  9. |  2 | 鋼鐵俠 | 120 |      1 | 我有一身鐵甲 | 
  10. |  3 | 綠巨人 |   0 |      2 | 我有一身肉    | 
  11. +----+-----------+-----+--------+--------------------+ 
  12. rows in set (0.00 sec) 
  13.  
  14. mysql> select * from test_transaction; 
  15. +----+-----------+-----+--------+--------------------+ 
  16. | id | user_name | age | gender | desctiption        | 
  17. +----+-----------+-----+--------+--------------------+ 
  18. |  1 | 金剛狼 | 127 |      1 | 我有一雙鐵爪 | 
  19. |  2 | 鋼鐵俠 | 120 |      1 | 我有一身鐵甲 | 
  20. |  3 | 綠巨人 |   0 |      2 | 我有一身肉    | 
  21. +----+-----------+-----+--------+--------------------+ 
  22. rows in set (0.00 sec) 
  23.  
  24. mysql> insert into test_transaction (`id`,`user_name`,`age`,`gender`,`desctiption`) values (4, '死侍', 18, 0, 'A bad boy'); 
  25. 1062 - Duplicate entry '4' for key 'PRIMARY' 
  26. mysql>  

那么這是什么問題呢?

個人認為, 如果你的表中真的會出現兩條完全相同的記錄, 考慮一下, 最起碼的表規范(第二范式)是否先滿足一下?

責任編輯:武曉燕 來源: Segmentfault
相關推薦

2022-04-27 07:32:02

臟讀幻讀不可重復讀

2024-04-24 08:26:35

事務數據InnoDB

2024-04-19 08:18:47

MySQLSQL隔離

2019-03-21 09:06:00

數據庫復讀幻讀

2022-01-03 07:18:05

臟讀幻讀 MySQL

2023-11-01 14:13:00

MySQL事務隔離級別

2025-02-26 10:40:44

數據庫并發幻讀

2022-06-29 11:01:05

MySQL事務隔離級別

2021-08-02 09:01:05

MySQL 多版本并發數據庫

2023-02-02 07:06:10

2023-10-26 00:41:46

臟讀數據幻讀

2024-05-13 11:46:33

MySQL數據庫

2019-05-28 13:50:27

MySQL幻讀數據庫

2024-07-16 08:19:46

MySQL數據InnoDB

2021-04-20 19:21:50

臟讀MySQL幻讀

2023-12-26 08:08:02

Spring事務MySQL

2019-12-24 14:50:01

MySQL可重復讀數據庫

2024-03-11 00:00:00

mysqlInnoDB幻讀

2022-09-21 09:00:10

MySQL幻讀隔離級別

2023-08-09 17:22:30

MVCCMySQL數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆精品久久 | 中文字幕在线看人 | 国产 日韩 欧美 在线 | 怡红院怡春院一级毛片 | 久久久妇女国产精品影视 | 激情影院久久 | 狠狠操狠狠干 | 日韩欧美三级 | 国产高清在线精品一区二区三区 | 亚洲精品视频免费观看 | 欧美激情在线精品一区二区三区 | 先锋资源在线 | 日日射影院 | 亚洲1区| 欧美成人精品一区二区男人看 | 亚洲精品电影网在线观看 | 在线小视频 | 91精品国产91久久久 | 色综久久| 日韩视频―中文字幕 | 亚洲网站在线观看 | 日韩一区av | 欧美老妇交乱视频 | 成人性视频免费网站 | 国产在视频一区二区三区吞精 | 久久久激情 | 成人av资源在线 | 亚洲成人精选 | 国产精品一区一区 | 亚洲综合一区二区三区 | 国产福利资源在线 | 91成人在线 | 欧美日韩中文在线 | 羞羞涩涩在线观看 | 日韩av成人 | 日本一区二区不卡 | 久久精品一区二区三区四区 | 国产精品久久久久免费 | 无码日韩精品一区二区免费 | 久久国产免费看 | 欧美日韩在线观看视频网站 |