數(shù)據(jù)庫事務(wù)(ACID)中的I指隔離性(isolation):未完成的(也就是未提交的)事務(wù)必須不可視。在某個(gè)事務(wù)進(jìn)行期間,只有執(zhí)行該事務(wù)的一個(gè)會(huì)話能看到所做的變化。
oracle是通過使用還原段來實(shí)現(xiàn)隔離性的。還原段(undo)的目的:(1)事務(wù)恢復(fù);(2)事務(wù)回滾;(3)讀一致性
代碼
NAME???????????????????????????VALUE
-- ----------------------------?------------------------------
undo_management????????????????AUTO
undo_tablespace????????????????UNDO
undo_retention????????????????? 900?????????????????
下面通過update的過程來分析隔離性的實(shí)現(xiàn)。
?
? 首先,在DML操作影響的所有記錄以及關(guān)聯(lián)索引鍵上放置鎖定;接下來會(huì)生成重做,此時(shí)服務(wù)器進(jìn)程在日志緩沖區(qū)中寫入即將應(yīng)用于指定數(shù)據(jù)塊的變化。這個(gè)重做生成操作應(yīng)用于數(shù)據(jù)塊的變化和撤銷塊的變化,如果列是索引的一部分,也將索引的變化以及保護(hù)索引變化的撤銷塊變化寫入日志緩沖區(qū)。在生成重做后,完成(1)?(2)操作。然后,如上圖片如示進(jìn)行。
?
PS:我開始的時(shí)候一直不能理解隔離性,即如果沒有commit的話,只有執(zhí)行update的session才能看到變化,其它的session還是看到原來的值。更疑惑的是,當(dāng)執(zhí)行commit(只會(huì)觸發(fā)LGWR,并不會(huì)觸發(fā)DBWR)的時(shí)候,數(shù)據(jù)并沒有真正寫入db files,而其它的session居然可以看到更新的值。直至,了解到撤銷段和重定向的使用的時(shí)候,才解惑了。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

