偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺述當(dāng)前模式讀與一致性讀的區(qū)別

數(shù)據(jù)庫(kù) Oracle
筆者希望通過(guò)下述兩個(gè)例子,讓大家更容易理解到當(dāng)前模式讀與一致性讀之間的區(qū)別。

讓我從以下2個(gè)例子展開(kāi)我們的探討。

  1. Case1:    
  2. HELLODBA.COM>set time on    
  3. 10:22:09 HELLODBA.COM>update t_test1 set SECONDARY='A' where object_id = -1;    
  4. 1 row updated.    
  5. 10:22:22 HELLODBA.COM>commit;    
  6. Commit complete.    
  7. Session 1:    
  8. 10:22:25 HELLODBA.COM>update t_test1 set SECONDARY='B' where  object_id = -1 and SECONDARY='B' and (select count(*) from t_test2 t1, t_test2 t2) > 0;    
  9. rows updated.    
  10. 10:23:15 HELLODBA.COM>    
  11. Session 2:    
  12. 10:22:37 HELLODBA.COM>update t_test1 set SECONDARY='B' where object_id = -1;    
  13. 1 row updated.    
  14. 10:23:02 HELLODBA.COM>commit;    
  15. Commit complete.    
  16. 10:23:04 HELLODBA.COM>    
  17. Case2:    
  18. 10:25:38 HELLODBA.COM>update t_test1 set SECONDARY='A' where object_id = -1;    
  19. 1 row updated.    
  20. 10:25:48 HELLODBA.COM>commit;    
  21. Commit complete.    
  22. Session 1:    
  23. 10:26:05 HELLODBA.COM>update t_test1 set SECONDARY='B' where  object_id = -1 and SECONDARY='A' and (select count(*) from t_test2 t1, t_test2 t2) > 0;    
  24. rows updated.    
  25. 10:27:21 HELLODBA.COM>    
  26. Session 2:    
  27. 10:26:16 HELLODBA.COM>update t_test1 set SECONDARY='B' where object_id = -1;    
  28. 1 row updated.    
  29. 10:26:41 HELLODBA.COM>commit;    
  30. Commit complete.    
  31. 10:26:42 HELLODBA.COM>   

如果你觀察得足夠仔細(xì),你可以從上面2個(gè)例子看到一個(gè)有趣的現(xiàn)象:無(wú)論session 1是否命中到數(shù)據(jù),it最終都沒(méi)有修改數(shù)據(jù)。其根本原因就是當(dāng)前模式讀與一致性讀的區(qū)別。

我們知道,為了減少并發(fā)沖突,Oracle引入了MVCC(多版本并發(fā)控制,也叫MCC)方法。在這種機(jī)制中,并發(fā)事務(wù)不會(huì)因?yàn)橐恢滦缘脑蚨嗷プ枞?,除非他們要修改同一條記錄。他們會(huì)將日志中所有SCN大于本身事務(wù)SCN的日志做回滾,以保證本事務(wù)讀取到的數(shù)據(jù)塊與事務(wù)SCN的一致。在Oracle中,這樣的讀取行為就稱(chēng)為一致性讀。

然而,一致性讀所讀取到數(shù)據(jù)塊僅僅是某個(gè)時(shí)間點(diǎn)的一個(gè)快照,也就是說(shuō)這樣的數(shù)據(jù)是只讀的。如果要修改數(shù)據(jù),那么oracle需要讀取到當(dāng)前的數(shù)據(jù)塊,也就是當(dāng)前模式讀。

在一個(gè)UPDATE過(guò)程中,oracle會(huì)先一致性讀取與事務(wù)SCN一致的數(shù)據(jù)快照,并用where條件進(jìn)行過(guò)濾。讓后根據(jù)讀取到數(shù)據(jù)塊的ID,再?gòu)漠?dāng)前數(shù)據(jù)中讀取到相應(yīng)的數(shù)據(jù)塊進(jìn)行修改。但是,如在事務(wù)啟動(dòng)后到數(shù)據(jù)塊被讀取之間的這段時(shí)間內(nèi),相應(yīng)的數(shù)據(jù)塊發(fā)生了改變,那么可能就會(huì)有我們意想不到的事情發(fā)生。

往回看我們的***個(gè)例子。我們?cè)趕ession 1中,在10:22:25啟動(dòng)了update事務(wù)。但是,由于該事務(wù)中存在一個(gè)大的子查詢(xún),它會(huì)在幾十秒后才會(huì)讀取到需要被修改的數(shù)據(jù)。在Session 2中,我們?cè)?0:22:37開(kāi)始update這些數(shù)據(jù)并在10:23:02提交了事務(wù)。而這個(gè)時(shí)間是早于數(shù)據(jù)在session 1中被讀取到的時(shí)間的。當(dāng)session 2中的數(shù)據(jù)改變被提交后,session 1中的事務(wù)讀取到了該數(shù)據(jù)塊。因?yàn)閟ession 2中的事務(wù)SCN大于session 1中的事務(wù)SCN,因此會(huì)讀取UNDO中的數(shù)據(jù)進(jìn)行回滾,也就是說(shuō)它讀取到數(shù)據(jù)SECONDARY是'A',再通過(guò)條件(SECONDARY='B')過(guò)濾后,沒(méi)有數(shù)據(jù)被命中,因此也沒(méi)有數(shù)據(jù)被修改。

在第二個(gè)例子中,session 1的事務(wù)在一致性讀取到數(shù)據(jù)塊之前也發(fā)生了類(lèi)似的事情。當(dāng)它回滾了數(shù)據(jù)后,它一致性讀取到了滿(mǎn)足過(guò)濾條件(SECONDARY='A')的數(shù)據(jù)塊。此時(shí),它需要通過(guò)該數(shù)據(jù)塊ID再到當(dāng)前數(shù)據(jù)中讀取該數(shù)據(jù)塊。但是因?yàn)楫?dāng)前數(shù)據(jù)塊的內(nèi)容已經(jīng)被session 2中的事務(wù)所修改,它還是沒(méi)有能修改到數(shù)據(jù)。

我想,通過(guò)這兩個(gè)例子,讀者應(yīng)該更容易理解到當(dāng)前模式讀與一致性讀之間的區(qū)別。

【編輯推薦】

  1. 告訴你,如何成就DBA職業(yè)生涯
  2. DBA應(yīng)用技巧:如何升級(jí)InnoDB Plugin
  3. DBA必備:MySQL數(shù)據(jù)庫(kù)常用操作和技巧
  4. MySQL日志操作教程:DBA們管理的利器
  5. 詳解DBA如何安排SQL Server數(shù)據(jù)庫(kù)自動(dòng)監(jiān)控
責(zé)任編輯:艾婧 來(lái)源: HelloDBA
相關(guān)推薦

2011-05-04 10:19:13

MVCC

2017-07-25 14:38:56

數(shù)據(jù)庫(kù)一致性非鎖定讀一致性鎖定讀

2020-11-24 09:03:41

一致性MySQLMVCC

2020-09-10 10:26:44

MySQL數(shù)據(jù)庫(kù)MVCC

2021-06-22 10:22:08

業(yè)務(wù)IT一致性首席信息官

2022-12-14 08:23:30

2016-12-19 18:41:09

哈希算法Java數(shù)據(jù)

2019-09-05 08:43:34

微服務(wù)分布式一致性數(shù)據(jù)共享

2021-02-05 08:00:48

哈希算法?機(jī)器

2021-02-02 12:40:50

哈希算法數(shù)據(jù)

2024-05-28 00:50:00

RedisMySQL緩存

2021-02-04 06:30:26

Python編程語(yǔ)言

2021-04-24 16:58:03

數(shù)據(jù)庫(kù)工具技術(shù)

2023-12-01 13:51:21

數(shù)據(jù)一致性數(shù)據(jù)庫(kù)

2016-11-16 19:15:34

消息時(shí)序分布式系統(tǒng)

2021-07-26 06:33:42

CRDT數(shù)據(jù)CAP

2020-05-12 10:43:22

Redis緩存數(shù)據(jù)庫(kù)

2022-03-22 09:54:22

Hash算法

2022-10-19 12:22:53

并發(fā)扣款一致性

2021-06-30 21:13:49

CPUCache數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)