posts - 262,  comments - 221,  trackbacks - 0
          1.事務(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.事務(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ù)依然成功。

          4.不同情況下的事務(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)存中,也被稱為在線重做日志。

          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ù)將可以看到改變。



          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2009-02-18 16:44 Paul Lin 閱讀(1706) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle Concept
          <2009年2月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          1234567

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點(diǎn)博客

          好友博客

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 淳化县| 天峨县| 桃园县| 武宣县| 石首市| 车致| 定陶县| 广南县| 蒙城县| 洛阳市| 山丹县| 家居| 兰溪市| 双峰县| 浦北县| 乌鲁木齐县| 武鸣县| 南宁市| 海门市| 马公市| 武定县| 昆山市| 镇坪县| 屯昌县| 克东县| 综艺| 莱州市| 吉隆县| 金门县| 溧阳市| 桓仁| 南昌县| 绵竹市| 申扎县| 金乡县| 揭阳市| 安多县| 昭通市| 乡城县| 凤冈县| 宣汉县|