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

一致性非鎖定讀與一致性鎖定讀

運維 數據庫運維
一致性非鎖定讀講的是一條記錄被加了X鎖其他事務仍然可以讀而不被阻塞,是通過innodb的行多版本實現的,行多版本并不是實際存儲多個版本記錄而是通過undo實現。一致性鎖定讀講的是我可以通過SELECT語句顯式地給一條記錄加X鎖從而保證特定應用場景下的數據一致性。

背景

innodb存儲引擎實現了兩種標準的行級鎖:S鎖和X鎖,S鎖被稱為共享鎖,允許事務讀一行數據,X鎖被稱為排它鎖,允許事務刪除或更新一行數據。

一致性非鎖定讀指的是如果一條記錄被加了X鎖,其他事務還能讀取這條記錄。

一致性鎖定讀指的是一個事務可以通過SELECT語句給某條記錄加X鎖或者X鎖。

一個小栗子

我們假設有一個表和兩個事務,表名字為mytest,事務名字為t1和t2:

t1 t2 t3 t4
a bb bb ccc

t1和t2的執行時序如下: 

 

這里我先拋出兩個問題:

  • 上面Mark A處顯然t1已經給記錄加了X鎖,并且在事務內修改了數據,此時t2看到的數據是什么?
  • 上面Mark B處事務t1已經提交此時t2看到的數據是什么?

行多版本控制

行多版本將的是innodb為每個行記錄存儲了多個版本,記住,這里是多個版本不是兩個版本,在剛開始接觸多版本的時候,我的疑問是innodb對每個行要存儲多個版本是多么浪費存儲空間呀?然而進一步了解,原來所謂的多版本只是innodb聰明地撒了個謊,多個版本是通過undo日志實現的,這里可以理解為既然undo日志包括了所有用來恢復歷史版本數據的信息,那么我們只要將“不同版本”指針指向不同時間節點的undo日志即可,這樣讀取的時候通過對不同時間節點的undo日志進行恢復從而得到不同的版本數據。同時對于undo日志的讀取是不需要加鎖的,因此這極大地提高了數據庫的并發性。

這里回答了上面的***個問題:t2此時看到的應該是歷史版本的數據,也就是t1修改之前的數據,如下:

  1. mysql> select * from mytest where t2='bb'
  2.  
  3. +------+------+------+------+ 
  4.  
  5. | t1 | t2 | t3 | t4 | 
  6.  
  7. +------+------+------+------+ 
  8.  
  9. | a | bb | bb | ccc | 
  10.  
  11. +------+------+------+------+ 
  12.  
  13. 1 row in set (0.00 sec) 
  14.  
  15. READ COMMITTED 與 REPEATABLE READ  

這里復習一下SQL標準定義的四個隔離級別分別為:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

innodb默認的隔離級別為REPEATABLE READ且使用next key locking技術解決的幻讀的問題,READ COMMITTED值的是一個事務可以讀取其他事務已經提交的數據,而REPEATABLE READ要求一個事務在事務內可以重復讀取一條記錄,因此上面第二個問題的答案是此時t2看到的是什么跟此時數據庫的隔離級別有關系,比如此時的隔離級別為:

  1. mysql> select @@tx_isolation; 
  2.  
  3. +-----------------+ 
  4.  
  5. | @@tx_isolation | 
  6.  
  7. +-----------------+ 
  8.  
  9. REPEATABLE-READ | 
  10.  
  11. +-----------------+ 
  12.  
  13. 1 row in set (0.00 sec)  

因此t2在Mark B的地方看到的應該是老數據:

  1. mysql> select * from mytest where t2='bb'
  2.  
  3. +------+------+------+------+ 
  4.  
  5. | t1 | t2 | t3 | t4 | 
  6.  
  7. +------+------+------+------+ 
  8.  
  9. | a | bb | bb | ccc | 
  10.  
  11. +------+------+------+------+ 
  12.  
  13. 1 row in set (0.00 sec) 
  14.  
  15. mysql>  

如果此時的事務隔離級別為READ COMMITTED,則t2在Mark B處看到的應該是新數據。

一致性鎖定讀

一致性非鎖定讀的情況下即使記錄因為UPDATE而被加了X鎖,其他事務仍然能夠讀取記錄,不會阻塞。而如果一個事務希望在讀取的時候就把記錄鎖住,不允許其他事務進行修改應該怎么做呢?那就是SELECT … FOR UPDATE,SELECT … FOR UPDATE顯式地給一條記錄加X鎖,因此其他事務不能獲取該記錄的任何鎖。我們也可以使用SELECT … LOCK IN SHARE MODE來給記錄顯式地加S鎖,因此其他事務能夠獲取該記錄的S鎖而不能獲取該記錄的X鎖,這兩種語句都是有特定的應用場景的。

總結

再總結一下,一致性非鎖定讀講的是一條記錄被加了X鎖其他事務仍然可以讀而不被阻塞,是通過innodb的行多版本實現的,行多版本并不是實際存儲多個版本記錄而是通過undo實現。一致性鎖定讀講的是我可以通過SELECT語句顯式地給一條記錄加X鎖從而保證特定應用場景下的數據一致性。 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2020-11-24 09:03:41

一致性MySQLMVCC

2020-09-10 10:26:44

MySQL數據庫MVCC

2011-05-04 10:19:13

MVCC

2011-05-04 09:43:23

當前模式讀一致性讀

2022-12-14 08:23:30

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數據

2021-06-22 10:22:08

業務IT一致性首席信息官

2016-12-19 18:41:09

哈希算法Java數據

2020-05-12 10:43:22

Redis緩存數據庫

2022-03-22 09:54:22

Hash算法

2021-06-30 21:13:49

CPUCache數據

2022-10-19 12:22:53

并發扣款一致性

2021-02-04 06:30:26

Python編程語言

2016-11-16 19:15:34

消息時序分布式系統

2020-03-16 11:55:28

PaxosRaft協議

2021-08-13 07:56:13

Raft算法日志

2019-10-11 23:27:19

分布式一致性算法開發

2020-07-20 08:30:37

算法哈希分布式系統

2017-07-02 16:28:06

MySQL數據庫集群
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成年网站在线观看 | 成人在线黄色 | 国产精品九九九 | 国产精品一卡二卡三卡 | 欧美日韩中文字幕在线 | 亚洲精品一区二区三区四区高清 | 国产精品日日夜夜 | 久久97精品 | 香蕉视频黄色 | 天天射网站 | 国产激情免费视频 | 人人人人干 | 精品久久国产 | 国产一区二区中文字幕 | 日韩欧美一区二区三区四区 | 日韩在线免费播放 | 欧美日韩亚洲一区 | 黄色一级片在线播放 | 亚洲v日韩v综合v精品v | 在线日韩福利 | 国产视频精品在线观看 | 99久久精品国产一区二区三区 | 日韩精品一区二区三区中文在线 | 欧美日韩久 | 夜夜爽99久久国产综合精品女不卡 | 国产精品片aa在线观看 | 国产在线精品一区二区三区 | 国产精品精品视频一区二区三区 | 日韩免费网站 | 岛国在线免费观看 | 正在播放国产精品 | 精品欧美久久 | 国产专区在线 | 国产精品欧美精品 | 亚洲色片网站 | 欧美日韩视频 | 欧美高清视频一区 | 亚洲精品一区二区 | 日韩在线不卡 | 精品一区国产 | 久久精品97|