国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
第四章 事務(wù)管理

Oracle 概念(Oracle 10.2) 第四章 事務(wù)管理

4事務(wù)管理

這一章對(duì)事務(wù)做了定義以及描述了如何通過事務(wù)管理你的工作。

本章包含下列內(nèi)容:

事務(wù)的介紹

事務(wù)管理概述

自主事務(wù)概述

事務(wù)介紹

事務(wù)是包含一個(gè)多或多個(gè)SQL語句的邏輯單位。一個(gè)事務(wù)是一個(gè)原子單位。事務(wù)中的所有SQL語句只能全部提交(應(yīng)用到數(shù)據(jù)庫(kù))或者全部回滾(從數(shù)據(jù)庫(kù)撤銷)。

一個(gè)事務(wù)從第一個(gè)執(zhí)行的SQL語句開始。一個(gè)事務(wù)在它被提交或者被回滾結(jié)束,結(jié)束事務(wù)可以顯式的使用COMMIT或者ROLLBACK語句或執(zhí)行一個(gè)DDL語句(隱含著事務(wù)結(jié)束)。

要說明事務(wù)的概念可以想象一個(gè)銀行數(shù)據(jù)庫(kù)。當(dāng)一個(gè)銀行客戶從儲(chǔ)蓄賬號(hào)中取出錢到活期賬號(hào)中,事務(wù)由三個(gè)獨(dú)立的操作組成:

儲(chǔ)蓄帳戶減值

活期帳戶增值

在事務(wù)日志中記錄事務(wù)

Oracle必須適合兩種情況。如果三個(gè)SQL語句都按照正確的順序執(zhí)行來維護(hù)賬號(hào),事務(wù)的結(jié)果可以應(yīng)用到數(shù)據(jù)庫(kù)中。雖然如此,如果發(fā)生一個(gè)帳戶資金不足、無效賬號(hào)或者硬件錯(cuò)誤的問題讓事務(wù)中的一個(gè)或者兩個(gè)語句沒有完成,整個(gè)事務(wù)必須回滾確保帳戶余額是正確的。

圖4-1描述了銀行事務(wù)示例

語句執(zhí)行和事務(wù)控制

一個(gè)成功運(yùn)行的SQL語句和提交的事務(wù)不同。成功執(zhí)行意味著單個(gè)語句是:

解析

創(chuàng)建有效的SQL結(jié)構(gòu)

作為一個(gè)原子單位正確運(yùn)行。例如,多行更新的所有行都被修改

雖然如此,在包含語句的事務(wù)提交之前,事務(wù)都是可以回滾的,所有事務(wù)做的修改都可以撤銷。一個(gè)語句能夠成功運(yùn)行,事務(wù)不能(因?yàn)槭聞?wù)不是語句,只有開始和結(jié)束,只有提交和回滾,沒有成功和失敗的說法)。

提交意味著一個(gè)用戶顯示或者隱式的要求事務(wù)的變化持久化。一個(gè)顯式的請(qǐng)求是當(dāng)用戶執(zhí)行COMMIT語句時(shí)。一個(gè)隱式的請(qǐng)求是應(yīng)用程序正常結(jié)束或者一個(gè)DDL操作完成后。事務(wù)包含的SQL語句造成的修改變得持久,并對(duì)事務(wù)之后的其他用戶可見。事務(wù)提交之后執(zhí)行的SQL可以看到已經(jīng)提交的修改。

你可以用SET TRANSACTION ..... NAME語句在你開始事務(wù)之前設(shè)置事務(wù)名稱。這使得監(jiān)控長(zhǎng)時(shí)間運(yùn)行的事務(wù)更加容易,解決出現(xiàn)問題的分布式事務(wù)也是如此。

語句級(jí)別的回滾

如果SQL語句執(zhí)行的任何時(shí)候產(chǎn)生錯(cuò)誤,這個(gè)語句造成的所有的影響都會(huì)回滾?;貪L的結(jié)果就好像語句從沒有運(yùn)行過。這個(gè)操作是個(gè)語句級(jí)別的回滾。

SQL語句執(zhí)行時(shí)遇到的錯(cuò)誤導(dǎo)致語句級(jí)別回滾。當(dāng)向主鍵內(nèi)插入重復(fù)的數(shù)據(jù)就會(huì)產(chǎn)生這樣的錯(cuò)誤例子。死鎖(對(duì)同一數(shù)據(jù)的爭(zhēng)用)的SQL語句也會(huì)導(dǎo)致語句級(jí)別的回滾。如果在SQL語句解析時(shí)遇到了錯(cuò)誤,比如語法錯(cuò)誤,因?yàn)檫€沒有運(yùn)行,所以不會(huì)導(dǎo)致語句級(jí)別回滾。

一個(gè)SQL語句的失敗只會(huì)損失它想要的執(zhí)行的任何工作本身。不會(huì)導(dǎo)致?lián)p失當(dāng)前事務(wù)之前的任何工作。如果一個(gè)語句是DDL語句,然后就會(huì)隱含提交還沒有撤銷的操作(即使這個(gè)DDL語句有錯(cuò)誤也一樣)。

可恢復(fù)的空間分配

Oracle提供了一種在空間分配失敗事件中暫停、重新啟動(dòng)、執(zhí)行大的數(shù)據(jù)庫(kù)操作的辦法。這使得管理員可以采取正確的動(dòng)作,而不是Oracle數(shù)據(jù)庫(kù)對(duì)用戶返回一個(gè)錯(cuò)誤。在錯(cuò)誤環(huán)境被糾正之后,暫停的操作自動(dòng)重新開始。

只有在客戶端對(duì)于會(huì)話使用了ALTER SESSION語句來顯示啟動(dòng)重新開始功能之后,一個(gè)語句才能在運(yùn)行在重新開始模式(resumable)下。

當(dāng)下列情況出現(xiàn)時(shí)重新啟動(dòng)的空間分配會(huì)暫停:

空間不足

達(dá)到最大數(shù)據(jù)區(qū)段

超過空間限額

對(duì)于不可重新開始的空間分配,這些情況會(huì)導(dǎo)致錯(cuò)誤,語句被回滾。

語句的暫停導(dǎo)致事務(wù)的暫停。因而事務(wù)的所有資源會(huì)在語句暫停和重新啟動(dòng)這段時(shí)間一直持有。

當(dāng)錯(cuò)誤環(huán)境過去(例如,用戶介入或者其他查詢釋放了排序空間),暫停的語句自動(dòng)恢復(fù)執(zhí)行狀態(tài)。

事務(wù)管理概述

Oracle中的第一個(gè)執(zhí)行的SQL語句會(huì)開始一個(gè)事務(wù)。一個(gè)執(zhí)行的SQL語句是對(duì)實(shí)例產(chǎn)生調(diào)用的一個(gè)SQL語句,語句包括DML和DDL語句。

當(dāng)事務(wù)開始時(shí),Oracle對(duì)這個(gè)事務(wù)分配一段可用的undo表空間來保存新事務(wù)的重做條目。

一個(gè)事務(wù)在任一下列情況下終結(jié):

用戶提交了不附帶SAVEPOINT子句的COMMIT或ROLLBACK語句

用戶運(yùn)行例如CREATE,DROP,RENAME或ALTER的DDL語句。如果當(dāng)前事務(wù)中包含任何DML語句,Oracle先提交這個(gè)事務(wù),然后將這個(gè)DDL語句作為一個(gè)新的單獨(dú)的語句事務(wù)來運(yùn)行和提交(注意:即使這個(gè)DDL語句錯(cuò)誤也會(huì)如此,因?yàn)镺racle先提交事務(wù)再執(zhí)行DDL)。

一個(gè)用戶從Oracle中斷連接。當(dāng)前的事務(wù)被提交。

一個(gè)用戶進(jìn)程不正常中斷。當(dāng)前事務(wù)被回滾。

一個(gè)事務(wù)結(jié)束之后,下一個(gè)執(zhí)行的SQL語句自動(dòng)啟動(dòng)后續(xù)的事務(wù)。

注意:應(yīng)用程序應(yīng)該在程序中斷之前顯式的提交或者回滾事務(wù)。

提交事務(wù)

提交一個(gè)事務(wù)意味著事務(wù)中執(zhí)行的SQL語句造成的修改持久化。

在一個(gè)事務(wù)提交修改的數(shù)據(jù)之前,會(huì)發(fā)生下列事情:

Oracle已經(jīng)產(chǎn)生了undo信息。Undo信息包含事務(wù)中的SQL語句修改的數(shù)據(jù)的原始值

Oracle已經(jīng)在SGA的重做日志緩存中產(chǎn)生重做日志條目。重做日志記錄包含數(shù)據(jù)塊的修改和回滾段的修改信息。在事務(wù)提交之前這些修改會(huì)寫入磁盤。

修改已經(jīng)保存在SGA的數(shù)據(jù)庫(kù)緩存中。這些修改在事務(wù)提交之前會(huì)寫入磁盤。

    注意:提交的事務(wù)在SGA中數(shù)據(jù)庫(kù)緩存中保存的修改的數(shù)據(jù)不需要立刻由后臺(tái)數(shù)據(jù)庫(kù)寫入進(jìn)程(DBWn)寫入數(shù)據(jù)文件。這個(gè)寫入會(huì)在數(shù)據(jù)庫(kù)認(rèn)為寫入效率最高的時(shí)候?qū)懭搿?/span>可能在事務(wù)提交或者事務(wù)提交之后一段時(shí)間才寫入。

當(dāng)一個(gè)事務(wù)被提交,會(huì)發(fā)生下列事情:

1、相關(guān)undo表空間的內(nèi)部事務(wù)表記錄事務(wù)被提交,事務(wù)的唯一系統(tǒng)修改號(hào)(SCN)被分配并保存在表中。

2、日志寫入進(jìn)程(LGWR)將SGA的重做日志緩存中的重做日志條目寫入重組日志文件。它還將事務(wù)的SCN寫入重做日志文件中。這個(gè)原子事件代表了事務(wù)的完成。

3、Oracle釋放擁有的行和表上的鎖

4、Oracle標(biāo)識(shí)事務(wù)完成。

注意:LGWR默認(rèn)情況下會(huì)同步的將重做信息寫入在線重做日志文件,事務(wù)默認(rèn)情況下也會(huì)等待重做信息寫入磁盤,然后將提交返回給客戶。雖然如此,在低事務(wù)提交級(jí)別的應(yīng)用程序開發(fā)人員可以指定重做信息可以異步寫入,而事務(wù)也不需要等待重做日志寫入磁盤。

回滾事務(wù)

回滾的意思是在一個(gè)沒有提交的事務(wù)中撤銷其中SQL執(zhí)行造成的數(shù)據(jù)修改。Oracle使用undo表空間(或者回滾段)來保存原始值。重做日志包含修改的記錄。

Oracle可以回滾整個(gè)沒有提交的事務(wù)。而且也可以回滾到未提交事務(wù)中標(biāo)識(shí)為保存點(diǎn)(savepoint)的尾部。

所有類型的回滾都使用同樣的過程:

語句級(jí)別回滾(語句執(zhí)行錯(cuò)誤或者死鎖)

回滾到保存點(diǎn)(savepoint)

根據(jù)用戶要求回滾

進(jìn)程意外中斷造成的事務(wù)回滾

實(shí)例意外中斷的未決事務(wù)回滾

恢復(fù)過程中沒有完成的事務(wù)的回滾

如果不指向任何保存點(diǎn)(savepoint)回滾整個(gè)事務(wù),會(huì)發(fā)生:

1、 Oracle使用相關(guān)undo表空間來撤銷所有SQL語句造成的改變

2、 Oracle釋放所有數(shù)據(jù)鎖

3、 結(jié)束事務(wù)。

事務(wù)保存點(diǎn)

你可以在事務(wù)環(huán)境中標(biāo)識(shí)叫做保存點(diǎn)的中間標(biāo)志。保存點(diǎn)(savepoint)將一個(gè)長(zhǎng)事務(wù)分成多個(gè)小部分。

使用保存點(diǎn),你可以在一個(gè)長(zhǎng)事務(wù)中在任意點(diǎn)標(biāo)識(shí)你的工作。這樣你可以選擇回滾事務(wù)中當(dāng)前檢查點(diǎn)之前的工作,或者檢查點(diǎn)之后的工作。例如,你可以在執(zhí)行一系列長(zhǎng)的復(fù)雜的更新時(shí)使用檢查點(diǎn),所以如果你遇到了一個(gè)錯(cuò)誤,你不需要重新執(zhí)行所有的語句。

在應(yīng)用程序開發(fā)中保存點(diǎn)也非常有用。如果一個(gè)過程包含多個(gè)函數(shù),然后你可以在每個(gè)函數(shù)開始前設(shè)置一個(gè)保存點(diǎn)。這樣如果一個(gè)函數(shù)失敗了,你很容易將數(shù)據(jù)返回到函數(shù)執(zhí)行前的狀態(tài)并用不同的參數(shù)來執(zhí)行函數(shù),或者你可以執(zhí)行一個(gè)恢復(fù)動(dòng)作。

回滾一個(gè)檢查點(diǎn)之后,Oracle會(huì)釋放回滾語句獲得的數(shù)據(jù)鎖。其他等待鎖定資源的事務(wù)就可以執(zhí)行了。其他打算更新鎖定行的事務(wù)也可以執(zhí)行了。

當(dāng)一個(gè)事務(wù)回滾到保存點(diǎn),會(huì)發(fā)生:

1、 Oracle只回滾檢查點(diǎn)之后的語句

2、 Oracle維護(hù)所有的保存點(diǎn),但是指定保存點(diǎn)之后的所有檢查點(diǎn)做的改變都將丟失。

3、 Oracle釋放這個(gè)檢查點(diǎn)以來所有需要的表或行鎖,但是保留保存點(diǎn)之前需要的所有數(shù)據(jù)鎖。

事務(wù)仍然保持活動(dòng)并可以繼續(xù)運(yùn)行。

當(dāng)一個(gè)會(huì)話在等待一個(gè)事務(wù)時(shí),回滾到檢查點(diǎn)不會(huì)釋放任何行鎖。如果事務(wù)沒有獲得鎖,為確保一個(gè)事務(wù)沒有掛起,在UPDATE和DELETE語句前執(zhí)行FOR UPDATE ……NOWAIT。(這個(gè)指向已經(jīng)回滾的保存點(diǎn)之前獲得的鎖。保存點(diǎn)之后的獲得的鎖都被釋放了,因?yàn)楸4纥c(diǎn)之后執(zhí)行的語句都被完全回滾。)

事務(wù)命名

你可以使用一個(gè)簡(jiǎn)單的容易記憶的文本字符串命名一個(gè)事務(wù)。名字提示了事務(wù)是做什么的。事務(wù)命名代替了分布式事務(wù)的提交備注,包含下列優(yōu)點(diǎn):

很容易監(jiān)控長(zhǎng)時(shí)間運(yùn)行的事務(wù)和解決有問題的分布式事務(wù)

你可以在應(yīng)用程序中和事務(wù)ID一起顯示事務(wù)名稱。例如,在監(jiān)控系統(tǒng)活動(dòng)時(shí),數(shù)據(jù)庫(kù)管理員可以在企業(yè)管理器中顯示事務(wù)名稱。

事務(wù)名稱寫入到事務(wù)審核重做記錄中,兼容Oracle9i或更高版本

LogMiner可以使用事務(wù)名稱在重做日志中搜索特定的事務(wù)審核記錄

你可以在數(shù)據(jù)字典視圖中使用事務(wù)名查找特定的事務(wù),如V$TRANSACTION

事務(wù)如何命名

在啟動(dòng)事務(wù)之前,使用SET TRANSACTION  NAME語句來命名事務(wù)。

當(dāng)你命名一個(gè)事務(wù)時(shí),你同時(shí)將事務(wù)名稱和ID做了關(guān)聯(lián)。事務(wù)名稱并不需要保證唯一。同一個(gè)用戶同時(shí)可以擁有同名的不同事務(wù)。你可以使用任何名稱來分辨不同的事務(wù)。

提交事務(wù)

在以前的發(fā)布版本中,你可以使用提交備注來對(duì)事務(wù)進(jìn)行關(guān)聯(lián)。雖然如此,一個(gè)備注只有在事務(wù)提交時(shí)才會(huì)關(guān)聯(lián)索引。

提交備注在后續(xù)版本中仍然支持。雖然如此,Oracle強(qiáng)烈建議你使用事務(wù)名稱。提交備注在命名事務(wù)中會(huì)被忽略。

兩步提交機(jī)制

在分布式數(shù)據(jù)庫(kù)中,Oracle必須跨網(wǎng)絡(luò)協(xié)調(diào)事務(wù)控制以及維護(hù)數(shù)據(jù)完整性。即使在網(wǎng)絡(luò)或系統(tǒng)故障的情況下也要做到。

分布式事務(wù)指的是包含在分布式數(shù)據(jù)庫(kù)上兩個(gè)或多個(gè)節(jié)點(diǎn)上運(yùn)行的一個(gè)或多個(gè)更新數(shù)據(jù)的語句的事務(wù)。

兩步提交確保了參與一個(gè)分布式事務(wù)的所有數(shù)據(jù)庫(kù)服務(wù)器的事務(wù)完全失敗或者完全成功。兩步提交機(jī)制還保護(hù)了完整性約束隱含的DML操作、遠(yuǎn)程過程調(diào)用和觸發(fā)器等。

Oracle的兩步提交機(jī)制對(duì)使用分布式事務(wù)的用戶來說是完全透明的。事實(shí)上,用戶甚至不需要知道事務(wù)是分布式的。COMMIT語句標(biāo)識(shí)了事務(wù)的結(jié)束,并自動(dòng)啟動(dòng)兩步提交機(jī)制來提交事務(wù)。在數(shù)據(jù)庫(kù)應(yīng)用程序中不需要為包含的分布式事務(wù)進(jìn)行額外的編碼或者復(fù)雜的語法定義。

后臺(tái)恢復(fù)進(jìn)程(RECO)自動(dòng)解決有問題的分布式事務(wù),這些問題事務(wù)指的是由于任何原因的系統(tǒng)或網(wǎng)絡(luò)故障導(dǎo)致的提交失敗。當(dāng)故障被修復(fù),通訊重新建立時(shí),每個(gè)本地Oracle數(shù)據(jù)庫(kù)的RECO進(jìn)程自動(dòng)提交和回滾問題進(jìn)程,從而保證相關(guān)節(jié)點(diǎn)的一致性。

在長(zhǎng)期的故障中,Oracle允許每個(gè)本地管理員手工提交或者回滾任何由于故障導(dǎo)致的有問題的分布式事務(wù)。這個(gè)選項(xiàng)使得本地?cái)?shù)據(jù)庫(kù)管理員可以釋放任何由于長(zhǎng)時(shí)間故障而造成的鎖。

如果一個(gè)數(shù)據(jù)庫(kù)必須恢復(fù)到過去的一個(gè)時(shí)間點(diǎn),Oracle恢復(fù)工具可以讓其他站點(diǎn)的數(shù)據(jù)庫(kù)管理員也恢復(fù)他們的數(shù)據(jù)庫(kù)到同一的時(shí)間點(diǎn)。這個(gè)操作確保了整體數(shù)據(jù)庫(kù)的一致性。

自治事務(wù)概述

自治事務(wù)是指在一個(gè)事務(wù)內(nèi)部調(diào)用的獨(dú)立事務(wù)。一個(gè)自治事務(wù)可以讓你離開調(diào)用事務(wù)的環(huán)境、執(zhí)行一些SQL操作、提交或者撤銷這些操作,然后返回到調(diào)用事務(wù)的環(huán)境,然后繼續(xù)執(zhí)行這個(gè)事務(wù)。

只要開始執(zhí)行,一個(gè)自治事務(wù)就完全獨(dú)立于調(diào)用它的主事務(wù)。它看不到主事務(wù)的任何未提交的改變、不和注事務(wù)共享任何鎖和資源。自治事務(wù)產(chǎn)生的改變?cè)谧陨淼奶峤恢缶涂梢宰屍渌聞?wù)看到。

一個(gè)自治事務(wù)可以調(diào)用另一個(gè)自治事務(wù)。只要有足夠的資源,可以調(diào)用任意層次的自治事務(wù)。

在自治事務(wù)和它的調(diào)用事務(wù)之間可能產(chǎn)生死鎖。Oracle可以檢測(cè)到這個(gè)死鎖,并返回一個(gè)錯(cuò)誤。應(yīng)用開發(fā)人員負(fù)責(zé)避免死鎖出現(xiàn)。

自治事務(wù)在實(shí)現(xiàn)需要獨(dú)立執(zhí)行的動(dòng)作時(shí)非常有用,自治事務(wù)會(huì)忽略調(diào)用事務(wù)的提交或者回滾的操作,比如事務(wù)日志和重新計(jì)數(shù)這種情況。

自治PL/SQL塊

你可以在PL/SQL塊中調(diào)用自治事務(wù),使用標(biāo)記AUTONOMOUS_TRANSACTION。一個(gè)標(biāo)記可以直接編譯。你可以指定下列類型的PL/SQL塊為自治事務(wù):

存儲(chǔ)過程或函數(shù)

本地過程和函數(shù)

類型方法

自治事務(wù)塊的上層

當(dāng)一個(gè)自治PL/SQL塊執(zhí)行時(shí),調(diào)用者的事務(wù)環(huán)境就被暫停了。這個(gè)操作確保這個(gè)塊執(zhí)行的SQL操作不依賴且不影響調(diào)用者事務(wù)環(huán)境的狀態(tài)。

當(dāng)一個(gè)自治塊執(zhí)行另一個(gè)自治事務(wù)塊或者其本身時(shí),被調(diào)用塊并不和調(diào)用塊共享任何事物環(huán)境。雖然如此,當(dāng)一個(gè)自治塊執(zhí)行一個(gè)非自治塊時(shí)(就是說一個(gè)沒有聲明為自治事務(wù)),被調(diào)用塊繼承了調(diào)用事務(wù)塊的事務(wù)環(huán)境。

自治事務(wù)塊中的事務(wù)控制語句

自治PL/SQL塊中的事務(wù)控制語句只在當(dāng)前活動(dòng)的自治事務(wù)中起作用。下列語句:

SET TRANSACTION

COMMIT

ROLLBACK

SAVEPOINT

ROLLBACK TO SAVEPOINT

類似的,主事務(wù)中的事務(wù)控制語句只對(duì)本事務(wù)有效,不影響任何它調(diào)用的自治事務(wù)。例如,將主事務(wù)回滾到自治事務(wù)開始之前的保存點(diǎn)(savepoint)并不會(huì)撤銷自治事務(wù)。

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
[整理]Oracle面試題(基礎(chǔ)篇)
Oracle學(xué)習(xí)筆記
CSDN技術(shù)中心 ORACLE 鎖
Oracle與SQLServer事務(wù)處理的比較
Oracle數(shù)據(jù)完整性和鎖機(jī)制
Oracle與SQL Server事務(wù)處理的比較 - 51CTO.COM
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服