跟我一起學Oracle 11g【11】----Oracle 中的事務


前言

好些天,沒有更新這個系列了。最近工作出差,而且在幾個城市走來走去,在而且是自己也在學習Spring.Net,所以時間比較少呢!但,不管怎么樣,我都會把這個系列更新完成。

5.1節過了,祝大家節后快樂。

1。什么是數據庫事務

數據庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要么全部成功要么全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。---【來自百度百科】

2。事務的特點

  • 原子性(atomicity)

  事務必須是原子工作單元;對於其數據修改,要么全都執行,要么全都不執行。

  • 一致性(consistency)

  事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。

  • 隔離性(isolation)

  由並發事務所作的修改必須與任何其它並發事務所作的修改隔離,也就是多個事務可以同時進行,互相不產生影響。

  • 持久性(durability)

  事務完成之后,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。

3.事務保存點(Savepoint)

保存點提供了一種機制,用於回滾部分事務。

語法:

savepoint 事務名

 保存點有什么作用呢?作用非常的大呢。

比如,有一個數據庫管理員,在早上的時候,設置了一個保存點a1,然后工作(對數據庫進行增刪改查),到了中午他又設置了一個保存點a2,到了下午他又繼續工作(還是對數據庫進行增刪改查),然后到了晚上。突然之間,他執行了一個很愚蠢的操作,把數據庫里的數據全部給刪除了!!!!

那這個時候怎么辦呢?好在他在早上和中午的時候設置了保存點,然后只要回到保存點就可以了。

【例】在我的scott用戶下面。對emp表設置一個事務,然后刪除一條數據,最后在回滾事務。

設置一個事務,如下圖:

然后我們隊數據進行插入一條數據,

insert into emp values(8888,'Lanny','CLEAK',7782,to_date('2012-10-10','yyyy-mm-dd'),1000,100,20);

現在scott用戶下面的emp表已經有15條數據了。

5。回滾事務(rollback)

那如果我們現在撤銷剛剛的操作怎么辦呢?這個就需要回滾事務了。事務回滾是指將該事務已經完成的對數據庫的更新操作撤銷。

語法:

rollback to 事務名 --撤銷單個事務

or

rollback   --如果后面不加事務名,則撤銷所有存在的事務

【例】我們撤銷剛新加入進去的Lanny用戶。

6。事務的提交(commit)

事務的提交指的是把你剛剛操作的數據真正的寫入到數據庫中,這個時候 你就不能在運用rollback進行撤銷你剛才的操作了。

語法:

commit

【例】先設置一個保存點,然后往emp里插入一條數據,接着提交事務。

①設置一個保存點

savepoint mySave2;

②插入數據

insert into emp values(9999,'Good','CLEAK',7782,to_date('2012-10-10','yyyy-mm-dd'),1000,100,20);

③提交事務

④測試回滾

OK,那這個時候,如果我在回滾到mySave2這個保存點可以嗎?我們操作,得到如下錯誤:

為什么呢?因為數據庫一旦commit了數據,那么就會撤銷所有的保存點。所以,你會得到這么一個錯誤哦。

7。Oracle事務的一些屬性

7.1只讀事務(read only)

只讀事務,只運行執行查詢操作,而不允許執行DML(刪除、增加、修改)操作,使用只讀事務,使得用戶可以只取到某個時間點的數據。

假如有一個機票代售點,有一個管理員想在一個時間點進行統計總共賣出去的數量,這個時候可以使用只讀事務。設置了只讀事務之后,盡管有其它的對話產生,但是只讀事務不會去去取最新的事務的變化,從而可以保證一個時間點只取到需要的數據。

語法:

set transaction read only

【例】設置system用戶下的只讀事務

剛開始我們用system 用戶登錄,然后設置只讀事務,如下圖:

我用select * from scott.emp;這個語句查看了scott用戶下的emp表里的數據是14條。

ok,我現在在打開一個 PL/SQL developer,這一次我用scott這個用戶登錄進去。進去之后,我往scott用戶的emp里插入一條數據,如下:

insert into emp values(8888,'Lanny','CLEAK',7782,to_date('2012-10-10','yyyy-mm-dd'),1000,100,20);

目前,scott用戶下的emp表的數據是:

不意外的知道 數據有15條。

但是如果我們在回到system用戶下面的數據是多少條呢?用select * from scott.emp; 這個語句進行查詢,我們發現,我們依然得到的是14條數據。

上面的例子就是只讀事務。在system用戶下面,它設置了只讀事務,所以它只獲取到以前的值,而不會獲取更新后的數值。

7.1讀寫屬性 read write

可以將事務設置為可讀、可寫的狀態,其實這也就是事務的默認狀態。所以,改屬性的設置,並沒有多大的現實意義。可不不給與考慮。

語法很簡單:

set transaction read write

不過,需要注意的是:一旦設定了set transcation read write命令,那么該命令之前就不能出現set transaction命令之外的其它命令了。

 

如果你像上面一樣,你重新設定一遍 read write ,這樣是不行滴。

7.3 serializable隔離級別

serializable隔離級別指的是串行化事務。串行化事務和只讀(read only)事務實現相同的功能---隔離其它事務對數據庫的影響。但是串行化事務允許在其中執行任何的DML操作,比如增、刪、改、查。。。

我們現在還沒有進行serializable的設置,ok,我們測試一下。

①我們現在新增一條數據進emp表中,並且 我還進行了commit 操作。

insert into emp values(8888,'Lanny','clerk',7782,to_date('2001-5-21','yyyy-mm-dd'),2000,100,10);

②ok,我們重新運行一個 PL/SQL Development(注意:打開2個命令窗口,沒法測試)

現在,我們有2個 PL/SQL Development了。

③我們在新建的PL/SQL Development里進行查詢,和我先前得到的結果是一樣的,這並沒讓我們產生驚喜。

不出意外的得到了我們新插入的值。

好的,那現在我們進行個serializable操作,看看結果會怎么樣。。

①serialization的命令如下

set transaction isolation level serializable;

②ok,我們現在在新建的PL/SQL Development 新增一條數據,如下:

請注意,我已經用commit,把事務給提交了。

我們查一下數據:

③我們在回到我們初次打開的窗口,進行查詢,結果如下

我們沒有得到我們剛插入的數據,這就是serializable的作用。

7.4 read  commit

這個事務是默認級別的事務,即會讀取其他事務已經提交的事務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM