1、事務(wù)概念:
概念:在數(shù)據(jù)庫(kù)中事務(wù)是工作的邏輯單元,一個(gè)事務(wù)是由一個(gè)或多個(gè)完成一組的相關(guān)行為的SQL語(yǔ)句組成,通過事務(wù)機(jī)制確保這一組SQL語(yǔ)句所作的操作要么完全成功執(zhí)行,完成整個(gè)工作單元操作,要么一點(diǎn)也不執(zhí)行。
主要特性:確保數(shù)據(jù)庫(kù)的完整性。
2、事務(wù)的ACID特性
-
對(duì)一組SQL語(yǔ)句操作構(gòu)成事務(wù),數(shù)據(jù)庫(kù)操作系統(tǒng)必須確保這些操作的原子性,一致性,隔離性,持久性.
1、 原子性(Atomicity)
事務(wù)的原子性是指事務(wù)中包含的所有操作要么全做,要么不做,也就是說所有的活動(dòng)在數(shù)據(jù)庫(kù)中要么全部反映,要么全部不反映,以保證數(shù)據(jù)庫(kù)的一致性。
2、 一致性(Consistency)
事務(wù)的一致性是指數(shù)據(jù)庫(kù)在事務(wù)操作前和事務(wù)處理后,其中數(shù)據(jù)必須滿足業(yè)務(wù)的規(guī)則約束。
3、 隔離性(Isolation)
隔離性是指數(shù)據(jù)庫(kù)允許多個(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ù)的重要性決定的。
3、事務(wù)的控制語(yǔ)句
在Oracle數(shù)據(jù)庫(kù)中,沒有提供開始事務(wù)處理語(yǔ)句,所有的事務(wù)都是隱式開始的,也就是說在oracle中,用戶不可以顯示使用命令來開始一個(gè)事務(wù).oracle任務(wù)第一條修改數(shù)據(jù)庫(kù)的語(yǔ)句,或者一些要求事務(wù)處理的場(chǎng)合都是事務(wù)的隱式開始。但是當(dāng)用戶想要終止一個(gè)事務(wù)處理時(shí),必須顯示使用commit和rollback語(yǔ)句結(jié)束。
根據(jù)事務(wù)ACID屬性,Oracle提供了如下的事務(wù)控制語(yǔ)句:
Set transaction 設(shè)置事物屬性
Set constrains 設(shè)置事物的約束模式
約束模式是指:在事務(wù)中修改數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)中的約束立即應(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ù)庫(kù)所作的任何操作
Commit 提交事務(wù) 對(duì)數(shù)據(jù)庫(kù)的操作做持久的保存。
3、1設(shè)置事物的屬性:
set transaction語(yǔ)句可用來設(shè)置事物的各種屬性。該語(yǔ)句必須放在事務(wù)處理的第一個(gè)語(yǔ)句.
也就是說,必須在任何insert、update 、delete語(yǔ)句以及其他的事務(wù)處理。
Set transaction的語(yǔ)句可以讓用戶對(duì)事務(wù)的以下屬性進(jìn)行設(shè)置
指定事務(wù)的隔離層
規(guī)定回滾事務(wù)所使用的存儲(chǔ)空間
命名事務(wù)
備注:在使用set transaction語(yǔ)句設(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ì)失效。
1、 數(shù)據(jù)異常
事務(wù)的隔離性定義了一個(gè)事務(wù)與其它事務(wù)的隔離程度.為了更好的理解隔離層,首先討論一下并發(fā)事務(wù)對(duì)同一個(gè)數(shù)據(jù)庫(kù)進(jìn)行訪問可能發(fā)生的情況.在并發(fā)事務(wù)中總體來說會(huì)發(fā)生如下3種情況
錯(cuò)讀 |臟讀
非重復(fù)讀取|不可重復(fù)讀
假讀|幻讀
錯(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ù)庫(kù)中數(shù)據(jù)不一致.這就叫錯(cuò)讀。
非重復(fù)讀。菏侵敢粋(gè)事務(wù)讀取數(shù)據(jù)庫(kù)中的數(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ù)不相同。
假讀:如果一個(gè)事務(wù)基于某個(gè)條件讀取數(shù)據(jù)后,另一個(gè)事務(wù)則更新了同一個(gè)表中的數(shù)據(jù),這時(shí)第一個(gè)事務(wù)再次讀取數(shù)據(jù)時(shí),根據(jù)搜索的條件返回了不同的行,這就是假讀。
事務(wù)中遇到的這些異常與事務(wù)的隔離性設(shè)置有關(guān),事務(wù)的隔離性設(shè)置越多,異常就出現(xiàn)的越少,但并發(fā)效果就越低,事務(wù)的隔離性設(shè)置越少,異常出現(xiàn)的越多,并發(fā)效果越高。
2、 選擇隔離層
針對(duì)3中讀取的數(shù)據(jù)時(shí)產(chǎn)生的不一致現(xiàn)象,在ANSI SQL標(biāo)準(zhǔn)92中定義了4個(gè)事務(wù)的隔離級(jí)別.如下圖所示:
隔離層 錯(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ù)庫(kù)中數(shù)據(jù)的操作語(yǔ)句,這包括 insert、update、delete、create語(yǔ)句。Read only是serializable的一個(gè)子集,區(qū)別是read only 只讀,而serialzable可以執(zhí)行DML操作。Read write它是默認(rèn)設(shè)置,該選項(xiàng)表示在事務(wù)中可以有訪問語(yǔ)句、修改語(yǔ)句.但不經(jīng)常使用.
3、 建立set transaction的語(yǔ)句
列舉如下:
Set transaction read only
Set transaction read write
Set transaction isolation level read committed
Set transaction isolation level serializable
注意:這些語(yǔ)句是互斥的.即不能夠同時(shí)設(shè)置兩個(gè)或者兩個(gè)以上的選項(xiàng)。
4、 結(jié)束事務(wù):
什么情況下代表事務(wù)的結(jié)束呢?
1、 Commit 提交事務(wù)
2、 rollback 回滾事務(wù)
//只讀的案例
SQL> set transaction read only;
Transaction set
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj redarmy 陳紅軍
SQL> update users set password='123' where username='mj';
update users set password='123' where username='mj'
ORA-01456: 不能在 READ ONLY 事務(wù)處理中執(zhí)行插入/刪除/更新操作
//臟讀的案例
SQL> set transaction isolation level read committed;
Transaction set
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj redarmy 陳紅軍
SQL> update users set password='123' where username='mj';
1 row updated
SQL> select * from users where username='mj';
USERNAME PASSWORD NAME ADDRESS ZIP
-------------------- -------------------- -------------------- -------------------- -------
mj 123 陳紅軍
SQL> rollback;
本文出自:億恩科技【www.riomediacenter.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|