深入了解Oracle事務(wù)
Oracle事務(wù)的對(duì)于Oracle數(shù)據(jù)庫(kù)的重要性不言而喻,下面就將為您詳細(xì)介紹Oracle事務(wù)方面的知識(shí),供您參考學(xué)習(xí)之用。
1.Oracle事務(wù)隔離
①一個(gè)未提交的事務(wù)所做的修改不能被其它事務(wù)所看到。只有當(dāng)事務(wù)提交成功后,在該事務(wù)之后執(zhí)行的其它事務(wù)才可能看到該事務(wù)所做的改變。
②在該事務(wù)提交之前已經(jīng)執(zhí)行了一部分而另一部分在該事務(wù)提交后執(zhí)行的剩余部分同樣也看不到該事務(wù)做出的改變。這是另一個(gè)Oracle特性:讀一致和快照。
③在該事務(wù)提交同時(shí)進(jìn)行的其它事務(wù)同樣也看不到該事務(wù)所做的改變。
2.語(yǔ)句級(jí)回滾
①當(dāng)一個(gè)SQL語(yǔ)句在執(zhí)行期間因?yàn)榘l(fā)生的任何錯(cuò)誤而中斷時(shí),將產(chǎn)生一個(gè)“語(yǔ)句級(jí)回滾”。該回滾的后果就像這個(gè)SQL語(yǔ)句根本沒(méi)有執(zhí)行過(guò)一樣。
②注意回滾是發(fā)生在“執(zhí)行”階段的,如果是在SQL語(yǔ)句的解析階段因?yàn)檎Z(yǔ)法問(wèn)題而無(wú)法執(zhí)行。因?yàn)闆](méi)有產(chǎn)生任何影響而不會(huì)出現(xiàn)“回滾”。
3.Oracle事務(wù)控制的分割( oracle沒(méi)有明顯的事務(wù)開(kāi)始,結(jié)束的語(yǔ)句塊,它將自動(dòng)形成事務(wù)塊。 )
如果一個(gè)事務(wù)中包含了DML語(yǔ)句和DDL語(yǔ)句,那么該事務(wù)會(huì)被分解成多個(gè)事務(wù)。首先在DDL之前的所有DML語(yǔ)句會(huì)被作為一個(gè)事務(wù)而一次性提交。然后Oracle會(huì)為這個(gè)DDL創(chuàng)建一個(gè)新的,單語(yǔ)句的事務(wù)。如果DDL語(yǔ)句執(zhí)行失敗了,那么DML事務(wù)依然成功。 每個(gè)DDL語(yǔ)句單獨(dú)成為一個(gè)事務(wù),也就是說(shuō)DDL語(yǔ)句不能回退。
4.不同情況下的Oracle事務(wù)控制
請(qǐng)注意:用戶從Oracle服務(wù)器斷開(kāi)連接和用戶進(jìn)程強(qiáng)行中斷的后果是不同的。
①前者典型的例子是Oracle服務(wù)器關(guān)閉或重啟,此時(shí)所有未提交事務(wù)會(huì)被提交。
②后者典型的例子用戶通過(guò)進(jìn)程管理器強(qiáng)行kill掉進(jìn)程,此時(shí)所有未提交事務(wù)所做的操作被回滾。
5.事務(wù)提交前要做的事情
Oracle提交一個(gè)事務(wù)之前,必須做以下幾件事情:
①記住數(shù)據(jù)被修改前是什么樣子的
②記住數(shù)據(jù)即將要被改成什么樣子
③記住redo log和undo log的關(guān)聯(lián)
④將SGA中已讀取到內(nèi)存的數(shù)據(jù)修改為新的值(此時(shí)并未真正保存到數(shù)據(jù)文件)
其中第一步是通過(guò)在undo表空間中記錄undo日志來(lái)完成的。第二步、第三步是通過(guò)向SGA中的redo日志緩沖區(qū)寫(xiě)記錄來(lái)完成的。這樣當(dāng)事務(wù)回滾時(shí)就可以從redo日志找到對(duì)應(yīng)的undo日志,從而找回之前的數(shù)據(jù)
★要特別注意的是:此時(shí)不一定會(huì)觸發(fā)DBWn進(jìn)程。
★要特別注意的另一個(gè)地方是:第2步記錄事務(wù)操作的改變是內(nèi)存中進(jìn)行的,還未寫(xiě)到磁盤(pán)上的redo日志文件
6.事務(wù)提交時(shí)所做的事情
①記錄SCN值(System Change Number)
②將在線重做日志記錄(位于SGA的redo日志緩沖區(qū)中)持久化到redo日志文件
③Oracle釋放資源和鎖
④Oracle將事務(wù)標(biāo)記為已結(jié)束
注意:只有在commit指令被發(fā)出后,才會(huì)將SGA中重做日志緩沖區(qū)的內(nèi)容刷新到磁盤(pán)的redo日志文件。在LGWR進(jìn)程執(zhí)行前,重做日志一直存在于內(nèi)存中,也被稱(chēng)為在線重做日志。
7.savepoint回滾和整個(gè)事務(wù)的回滾
注意當(dāng)Oracle事務(wù)回滾到某個(gè)savepoint時(shí),在savepoint之后的所有后續(xù)savepoint將失效。但此時(shí)Transaction還是活躍且可繼續(xù)的。這一點(diǎn)不同于整個(gè)事務(wù)的回滾。
8.自治事務(wù)
從傳統(tǒng)上來(lái)說(shuō),一個(gè)事務(wù)只有在完整執(zhí)行成功或回滾之后,才會(huì)進(jìn)行下一個(gè)事務(wù)。而自治事務(wù)允許在一個(gè)事務(wù)中調(diào)用運(yùn)行另一個(gè)事務(wù),被調(diào)用事務(wù)執(zhí)行完成后,調(diào)用事務(wù)繼續(xù)執(zhí)行之前未完成的操作直至事務(wù)結(jié)束
自治事務(wù)在被調(diào)用后,將和外圍事務(wù)完全獨(dú)立。彼此之間并不共享任何資源或者鎖,外圍事務(wù)所有未提交的改變對(duì)自治事務(wù)來(lái)說(shuō)都是不可見(jiàn)。自治事務(wù)提交后外圍事務(wù)將可以看到改變。
【編輯推薦】
刪除oracle服務(wù)項(xiàng)中不用的服務(wù)