1、事務(wù)概念:
概念:在數(shù)據(jù)庫中事務(wù)是工作的邏輯單元,一個事務(wù)是由一個或多個完成一組的相關(guān)行為的SQL語句組成,通過事務(wù)機制確保這一組SQL語句所作的操作要么完全成功執(zhí)行,完成整個工作單元操作,要么一點也不執(zhí)行。
主要特性:確保數(shù)據(jù)庫的完整性。
2、事務(wù)的ACID特性
-
對一組SQL語句操作構(gòu)成事務(wù),數(shù)據(jù)庫操作系統(tǒng)必須確保這些操作的原子性,一致性,隔離性,持久性.
1、 原子性(Atomicity)
事務(wù)的原子性是指事務(wù)中包含的所有操作要么全做,要么不做,也就是說所有的活動在數(shù)據(jù)庫中要么全部反映,要么全部不反映,以保證數(shù)據(jù)庫的一致性。
2、 一致性(Consistency)
事務(wù)的一致性是指數(shù)據(jù)庫在事務(wù)操作前和事務(wù)處理后,其中數(shù)據(jù)必須滿足業(yè)務(wù)的規(guī)則約束。
3、 隔離性(Isolation)
隔離性是指數(shù)據(jù)庫允許多個并發(fā)的事務(wù)同時對其中的數(shù)據(jù)進(jìn)行讀寫或修改的能力,隔離性可以防止多個事務(wù)的并發(fā)執(zhí)行時,由于它們的操作命令交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致性。
4、 持久性(durability)
事務(wù)的持久性是指在事務(wù)處理結(jié)束后,它對數(shù)據(jù)的修改應(yīng)該是永久的。即便是系統(tǒng)在遇到故障的情況下也不會丟失,這是數(shù)據(jù)的重要性決定的。
3、事務(wù)的控制語句
在Oracle數(shù)據(jù)庫中,沒有提供開始事務(wù)處理語句,所有的事務(wù)都是隱式開始的,也就是說在oracle中,用戶不可以顯示使用命令來開始一個事務(wù).oracle任務(wù)第一條修改數(shù)據(jù)庫的語句,或者一些要求事務(wù)處理的場合都是事務(wù)的隱式開始。但是當(dāng)用戶想要終止一個事務(wù)處理時,必須顯示使用commit和rollback語句結(jié)束。
根據(jù)事務(wù)ACID屬性,Oracle提供了如下的事務(wù)控制語句:
Set transaction 設(shè)置事物屬性
Set constrains 設(shè)置事物的約束模式
約束模式是指:在事務(wù)中修改數(shù)據(jù)時,數(shù)據(jù)庫中的約束立即應(yīng)用于數(shù)據(jù),還是將約束推遲到當(dāng)前事務(wù)結(jié)束后應(yīng)用。
Savepoint 在事務(wù)中建立一個存儲的點.當(dāng)事務(wù)處理發(fā)生異常而回滾事務(wù)時,可指定事務(wù)回滾到某存儲點.然后從該存儲點重新執(zhí)行。
Release savepoint 刪除存儲點
Rollback 回滾事務(wù) 取消對數(shù)據(jù)庫所作的任何操作
Commit 提交事務(wù) 對數(shù)據(jù)庫的操作做持久的保存。
3、1設(shè)置事物的屬性:
set transaction語句可用來設(shè)置事物的各種屬性。該語句必須放在事務(wù)處理的第一個語句.
也就是說,必須在任何insert、update 、delete語句以及其他的事務(wù)處理。
Set transaction的語句可以讓用戶對事務(wù)的以下屬性進(jìn)行設(shè)置
指定事務(wù)的隔離層
規(guī)定回滾事務(wù)所使用的存儲空間
命名事務(wù)
備注:在使用set transaction語句設(shè)置屬性時,對于規(guī)定回滾事務(wù)所使用的存儲空間的設(shè)置很少使用.對于命名事務(wù)也非常簡單,只有在分布式事務(wù)處理中才會體現(xiàn)出命名事務(wù)的用途.
注意:set transaction只對當(dāng)前事務(wù)有效,事務(wù)終止,事務(wù)當(dāng)前的設(shè)置將會失效。
1、 數(shù)據(jù)異常
事務(wù)的隔離性定義了一個事務(wù)與其它事務(wù)的隔離程度.為了更好的理解隔離層,首先討論一下并發(fā)事務(wù)對同一個數(shù)據(jù)庫進(jìn)行訪問可能發(fā)生的情況.在并發(fā)事務(wù)中總體來說會發(fā)生如下3種情況
錯讀 |臟讀
非重復(fù)讀取|不可重復(fù)讀
假讀|幻讀
錯讀|臟讀:當(dāng)一個事務(wù)修改數(shù)據(jù)時,另一事務(wù)讀取了該數(shù)據(jù),但是第一事務(wù)由于某種原因取消對數(shù)據(jù)修改,使數(shù)據(jù)返回了原狀態(tài),這是第二個事務(wù)讀取的數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)不一致.這就叫錯讀。
非重復(fù)讀。菏侵敢粋事務(wù)讀取數(shù)據(jù)庫中的數(shù)據(jù)后,另一個事務(wù)則更新了數(shù)據(jù),當(dāng)?shù)谝粋事務(wù)再次讀取其中的數(shù)據(jù)時,就會發(fā)現(xiàn)數(shù)據(jù)已經(jīng)發(fā)生了改變,這就是非重復(fù)讀取。非重復(fù)讀取所導(dǎo)致的結(jié)果就是一個事務(wù)前后兩次讀取的數(shù)據(jù)不相同。
假讀:如果一個事務(wù)基于某個條件讀取數(shù)據(jù)后,另一個事務(wù)則更新了同一個表中的數(shù)據(jù),這時第一個事務(wù)再次讀取數(shù)據(jù)時,根據(jù)搜索的條件返回了不同的行,這就是假讀。
事務(wù)中遇到的這些異常與事務(wù)的隔離性設(shè)置有關(guān),事務(wù)的隔離性設(shè)置越多,異常就出現(xiàn)的越少,但并發(fā)效果就越低,事務(wù)的隔離性設(shè)置越少,異常出現(xiàn)的越多,并發(fā)效果越高。
2、 選擇隔離層
針對3中讀取的數(shù)據(jù)時產(chǎn)生的不一致現(xiàn)象,在ANSI SQL標(biāo)準(zhǔn)92中定義了4個事務(wù)的隔離級別.如下圖所示:
隔離層 錯讀|臟讀 非重復(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è)置事物的隔離層位它時,事務(wù)與事務(wù)之間完全隔開,事務(wù)以串行的方式執(zhí)行,這并不是說一個事務(wù)必須結(jié)束才能啟動另外一個事務(wù),而是說這些事務(wù)的執(zhí)行的結(jié)果于一次執(zhí)行的事務(wù)的結(jié)果一致。
Read only和 read write 當(dāng)使用read only時,事務(wù)中不能有任何修改數(shù)據(jù)庫中數(shù)據(jù)的操作語句,這包括 insert、update、delete、create語句。Read only是serializable的一個子集,區(qū)別是read only 只讀,而serialzable可以執(zhí)行DML操作。Read write它是默認(rèn)設(shè)置,該選項表示在事務(wù)中可以有訪問語句、修改語句.但不經(jīng)常使用.
3、 建立set transaction的語句
列舉如下:
Set transaction read only
Set transaction read write
Set transaction isolation level read committed
Set transaction isolation level serializable
注意:這些語句是互斥的.即不能夠同時設(shè)置兩個或者兩個以上的選項。
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.cmtents.com】
服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|