主要特性:確保數(shù)據(jù)庫的完整性。
一、事務的ACID特性
對一組SQL語句操作構(gòu)成事務,數(shù)據(jù)庫操作系統(tǒng)必須確保這些操作的原子性,一致性,隔離性,持久性.
1、 原子性(Atomicity)
事務的原子性是指事務中包含的所有操作要么全做,要么不做,也就是說所有的活動在數(shù)據(jù)庫中要么全部反映,要么全部不反映,以保證數(shù)據(jù)庫的一致性。
2、 一致性(Consistency)
事務的一致性是指數(shù)據(jù)庫在事務操作前和事務處理后,其中數(shù)據(jù)必須滿足業(yè)務的規(guī)則約束。
3、 隔離性(Isolation)
隔離性是指數(shù)據(jù)庫允許多個并發(fā)的事務同時對其中的數(shù)據(jù)進行讀寫或修改的能力,隔離性可以防止多個事務的并發(fā)執(zhí)行時,由于它們的操作命令交叉執(zhí)行而導致數(shù)據(jù)的不一致性。
4、 持久性(durability)
事務的持久性是指在事務處理結(jié)束后,它對數(shù)據(jù)的修改應該是永久的。即便是系統(tǒng)在遇到故障的情況下也不會丟失,這是數(shù)據(jù)的重要性決定的。
二、事務的控制語句
oracle中,用戶不可以顯示使用命令來開始一個事務.oracle任務第一條修改數(shù)據(jù)庫的語句,或者一些要求事務處理的場合都是事務的隱式開始。但是當用戶想要終止一個事務處理時,必須顯示使用commit和rollback語句結(jié)束。
根據(jù)事務ACID屬性,oracle提供了如下的事務控制語句:
Set transaction 設(shè)置事物屬性
Set constrains 設(shè)置事物的約束模式
約束模式是指:在事務中修改數(shù)據(jù)時,數(shù)據(jù)庫中的約束立即應用于數(shù)據(jù),還是將約束推遲到當前事務結(jié)束后應用。
Savepoint 在事務中建立一個存儲的點.當事務處理發(fā)生異常而回滾事務時,可指定事務回滾到某存儲點.然后從該存儲點重新執(zhí)行。
Release savepoint 刪除存儲點
Rollback 回滾事務 取消對數(shù)據(jù)庫所作的任何操作
Commit 提交事務 對數(shù)據(jù)庫的操作做持久的保存。
a) 設(shè)置事務的屬性:
set transaction語句可用來設(shè)置事物的各種屬性。該語句必須放在事務處理的第一個語句.
也就是說,必須在任何insert、update 、delete語句以及其他的事務處理。
Set transaction的語句可以讓用戶對事務的以下屬性進行設(shè)置
指定事務的隔離層
規(guī)定回滾事務所使用的存儲空間
命名事務
備注:在使用set transaction語句設(shè)置屬性時,對于規(guī)定回滾事務所使用的存儲空間的設(shè)置很少使用.對于命名事務也非常簡單,只有在分布式事務處理中才會體現(xiàn)出命名事務的用途.
注意:set transaction只對當前事務有效,事務終止,事務當前的設(shè)置將會失效。
三、數(shù)據(jù)異常和隔離級別
a) 數(shù)據(jù)異常
事務的隔離性定義了一個事務與其它事務的隔離程度.為了更好的理解隔離層,首先討論一下并發(fā)事務對同一個數(shù)據(jù)庫進行訪問可能發(fā)生的情況.在并發(fā)事務中總體來說會發(fā)生如下3種情況
錯讀 |臟讀
非重復讀取|不可重復讀
假讀|幻讀
i. 錯讀|臟讀:當一個事務修改數(shù)據(jù)時,另一事務讀取了該數(shù)據(jù),但是第一事務由于某種原因取消對數(shù)據(jù)修改,使數(shù)據(jù)返回了原狀態(tài),這是第二個事務讀取的數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)不一致.這就叫錯讀。
ii. 非重復讀?。菏侵敢粋€事務讀取數(shù)據(jù)庫中的數(shù)據(jù)后,另一個事務則更新了數(shù)據(jù),當?shù)谝粋€事務再次讀取其中的數(shù)據(jù)時,就會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)發(fā)生了改變,這就是非重復讀取。非重復讀取所導致的結(jié)果就是一個事務前后兩次讀取的數(shù)據(jù)不相同。
iii. 假讀:如果一個事務基于某個條件讀取數(shù)據(jù)后,另一個事務則更新了同一個表中的數(shù)據(jù),這時第一個事務再次讀取數(shù)據(jù)時,根據(jù)搜索的條件返回了不同的行,這就是假讀。
b) 選擇隔離層
隔離層 錯讀|臟讀 非重復讀取|不可重復讀 假讀|幻讀
READ UNCOMMITTED(非提交讀) 是 是 是
READ COMMITTED(提交讀) 否 是 是
Repeatable READ(可重復讀) 否 否 是
Serializable(串行讀) 否 否 否
Oracle支持上述四種隔離層中的兩種:read committed 和serializable。除此之外oralce中還定義read only 和 read write隔離層。
Read committed 這是oracle默認的隔離層。
Serializable:設(shè)置事物的隔離層位它時,事務與事務之間完全隔開,事務以串行的方式執(zhí)行,這并不是說一個事務必須結(jié)束才能啟動另外一個事務,而是說這些事務的執(zhí)行的結(jié)果于一次執(zhí)行的事務的結(jié)果一致。
Read only和 read write 當使用read only時,事務中不能有任何修改數(shù)據(jù)庫中數(shù)據(jù)的操作語句,這包括 insert、update、delete、create語句。Read only是serializable的一個子集,區(qū)別是read only 只讀,而serialzable可以執(zhí)行DML操作。Read write它是默認設(shè)置,該選項表示在事務中可以有訪問語句、修改語句.但不經(jīng)常使用.
c) 建立set transaction的語句
列舉如下:
Set transaction read only
Set transaction read write
Set transaction isolation level read committed
Set transaction isolation level serializable
注意:這些語句是互斥的.即不能夠同時設(shè)置兩個或者兩個以上的選項。
d) 控制事務
Commit 提交事務
rollback 回滾事務
注意:
1、自動提交在以下情況中執(zhí)行
DDL 語句
DCL 語句
不使用 COMMIT 或 ROLLBACK 語句提交或回滾,正常結(jié)束會話
2、會話異常結(jié)束或系統(tǒng)異常會導致自動回滾