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