Oracle 事务概述
生活随笔
收集整理的這篇文章主要介紹了
Oracle 事务概述
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這篇文章是參考老相老師的教學視頻
http://v.youku.com/v_show/id_XNDAzOTI4MDQw.html
所做的學習筆記
1.事務(Transaction)的基本概念:
?????????? 事務由一組DML語句組成(insert/ update /delete);
?????????? 用commit; 就可以提交這個事務,也就是DML語句的改動寫入數(shù)據(jù)庫了.
?????????? 在commit之前使用Rollback就可以回滾DML語句造成的數(shù)據(jù)的改動.
? ? ? ? ? ?使用savepoint xx ?可以保存保存點:? ? ? ? ? 使用Rollback to xx 回滾到保存點.
下面做個例子:
登陸sqlplus:
例如hr賬戶下有一張表CL_DEPT:
現(xiàn)在去查看事務的系統(tǒng)視圖v$transaction, 是沒有人任何記錄的:
這時我執(zhí)行一條DML語句(insert),但是仲未Commit:
這時再去查看v$transaction,已經(jīng)出現(xiàn)一條record了?然后我再執(zhí)行一條DML語句(update),
再查看v$transaction, 還是一條記錄:?
注: v$transaction中的列:XIDUSN: ? undo segment number 回滾段序列號UBABLK: ?UBA(Undo block address) block number ? 回滾塊序列號UBAFIL: ? UBA file number ...
也是就說,在commit 或 rollback之前,無論執(zhí)行多少條DML語句.它們都屬于同1個事務的.注意: 若此時執(zhí)行grant等(DDL)語句, ?會自動觸發(fā)commit, 所以不要寫奇怪的代碼啊.
在事務提交之前,其他用戶是見不到你的改動,他們查詢對應的表,得到的還是原來的數(shù)據(jù):?這時我們commit?查看v$transaction, 事務消失, 表示事務結束了. 而其他用戶就可以見到hr修改后的數(shù)據(jù)了.
這是默認的隔離級別,下面會提到
?
下面介紹save point:我用hr賬戶再執(zhí)行一條DML語句, 這樣的話一條新的事務開始了.?這時我們執(zhí)行1個保存點x1?然后再insert 1條record:??這時我后悔了, 不想插入上面的那條record, 但是又想保留第一次插入的那條,就可以用Rollback to savepointname 來回滾到保存點:??如上圖, 插入了60,TEL MADRID就是保存點前一條DML語句插入的.
但是雖然執(zhí)行了Rollback 語句, 但是因為只是回滾到保存點,不是回滾整個事務,所以這個事務還沒完成的!
這是可以繼續(xù)rollback到前面的保存點, 或者commit..?
2.事務的隱式commit和rollback
1.執(zhí)行DDL語句(create table之類) 會隱式提交事務2. session異常退出(包括數(shù)據(jù)庫崩潰)會令session未提交的事務回滾.3. session 正常退出 (輸入 exit/關閉終端窗口/輸入ctrl +D) 會隱式提交事務. 這個要注意啊
無論如何,要盡量避免事務的隱式的commit和rollback.
3事務的特性
事務包含4大特性ACID:
分別是:
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
持久性(Durability)
3.1 原子性(Atomicity):
??? 事務的原子性是指事務中所有的操作,要么都做, 要么都不做,保證數(shù)據(jù)庫是一致的.
??? 例如:? A賬戶向B賬戶劃賬1000蚊,? 則先將A減少1000,然后將B增加1000,這兩個動作要么都提交,要么都回滾,不能只提交1個另1個無效,否則數(shù)據(jù)總賬就變化了.
3.2 一致性(Consistency):
?????? 一致性是指數(shù)據(jù)庫在事務操作前和事務處理后, 其中的數(shù)據(jù)必須都滿足業(yè)務規(guī)則約束.
??????? 例如: A, B賬戶的總金額在轉帳前和和轉帳后必須一致,其中的不一致必須是短暫的,在事務提交后就會消失的.
??????? 再如: 約定B賬戶不能多余1000元, 則轉出1000成功, 而B賬戶轉入失敗, 最終由原子性得到---整個事務回滾.
3.3 隔離性(Isolation):
??????? 隔離性是指數(shù)據(jù)庫允許多個并發(fā)事務同時對數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行時導致數(shù)據(jù)的不一致.
???
??????? 例如: 在A,B 之間轉帳時, C同時向A轉帳,若同時進行則A B之間的一致性不能滿足,所以當A B事務執(zhí)行時,其他事務不能訪問(修改)當前相關的數(shù)據(jù).
3.4 持久性(Durabiity)
?????? 持久性表示為: 事務處理結束后,對數(shù)據(jù)的修改是永久的,即使系統(tǒng)故障也不會丟失
?????? 在提交啊之前如果系統(tǒng)故障,則所有信息全部丟失,提交后數(shù)據(jù)存放在磁盤中,是永久性的.
4.事務的隔離級別.
級別:(只能用普通用戶執(zhí)行)
(串行)? SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
commit;
SET TRANSACTION ISOLATION LEVEL READ COMMITED;(默認)
4.1 SET TRANSACTION ISOLATION LEVEL READ COMMITED;(默認)
我們知道默認的事務隔離級別是這樣的:
如上面HR 和 scott的例子
Session B見不到 Session A提交前修改的數(shù)據(jù), 但Session A一旦提交, B馬上就見到了.
4.2 (串行)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
但是我們執(zhí)行上面那條語句后再試下:(用普通用戶執(zhí)行)
這時scott 執(zhí)行將事務隔離化設為串行:
?
?
這時HR 向cl_dept插入一條數(shù)據(jù):
?
這時Scott去查看這張表,當然是見不到HR未commit的新數(shù)據(jù)行的:
?
這時HR commit這條transaction:
?
再去scott那條session查看對應表, 發(fā)現(xiàn)即使hr commit了事務,? scott還是見不到修改后的數(shù)據(jù):
?
那什么時候scott才能看到Hr修改的數(shù)據(jù)呢,? 這時需要scott 執(zhí)行commit...
也就是說scott執(zhí)行了SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
之后,相當與自己開 1個事務, 在這個事務commit之前,? 他見不到其他session的任何的數(shù)據(jù)改動.
這個特性有時在不想見到數(shù)據(jù)改動的情況有用,例如提取數(shù)據(jù)做報表, 需要一定時間的靜態(tài)數(shù)據(jù).
?5.另外兩條 Set transaction 語句:
5.1 SET TRANSACTION? READ ONLY;
執(zhí)行了上面那個語句, 你就不能執(zhí)行DML語句了.. 也就是不能修改數(shù)據(jù).
除非你執(zhí)行rollback 或 commit;
5.1 SET TRANSACTION? READ WRITE;
這個是默認的,沒什么可說啦~
http://v.youku.com/v_show/id_XNDAzOTI4MDQw.html
所做的學習筆記
1.事務(Transaction)的基本概念:
?????????? 事務由一組DML語句組成(insert/ update /delete);
?????????? 用commit; 就可以提交這個事務,也就是DML語句的改動寫入數(shù)據(jù)庫了.
?????????? 在commit之前使用Rollback就可以回滾DML語句造成的數(shù)據(jù)的改動.
? ? ? ? ? ?使用savepoint xx ?可以保存保存點:? ? ? ? ? 使用Rollback to xx 回滾到保存點.
下面做個例子:
登陸sqlplus:
例如hr賬戶下有一張表CL_DEPT:
現(xiàn)在去查看事務的系統(tǒng)視圖v$transaction, 是沒有人任何記錄的:
這時我執(zhí)行一條DML語句(insert),但是仲未Commit:
這時再去查看v$transaction,已經(jīng)出現(xiàn)一條record了?然后我再執(zhí)行一條DML語句(update),
再查看v$transaction, 還是一條記錄:?
注: v$transaction中的列:XIDUSN: ? undo segment number 回滾段序列號UBABLK: ?UBA(Undo block address) block number ? 回滾塊序列號UBAFIL: ? UBA file number ...
也是就說,在commit 或 rollback之前,無論執(zhí)行多少條DML語句.它們都屬于同1個事務的.注意: 若此時執(zhí)行grant等(DDL)語句, ?會自動觸發(fā)commit, 所以不要寫奇怪的代碼啊.
在事務提交之前,其他用戶是見不到你的改動,他們查詢對應的表,得到的還是原來的數(shù)據(jù):?這時我們commit?查看v$transaction, 事務消失, 表示事務結束了. 而其他用戶就可以見到hr修改后的數(shù)據(jù)了.
這是默認的隔離級別,下面會提到
?
下面介紹save point:我用hr賬戶再執(zhí)行一條DML語句, 這樣的話一條新的事務開始了.?這時我們執(zhí)行1個保存點x1?然后再insert 1條record:??這時我后悔了, 不想插入上面的那條record, 但是又想保留第一次插入的那條,就可以用Rollback to savepointname 來回滾到保存點:??如上圖, 插入了60,TEL MADRID就是保存點前一條DML語句插入的.
但是雖然執(zhí)行了Rollback 語句, 但是因為只是回滾到保存點,不是回滾整個事務,所以這個事務還沒完成的!
這是可以繼續(xù)rollback到前面的保存點, 或者commit..?
2.事務的隱式commit和rollback
1.執(zhí)行DDL語句(create table之類) 會隱式提交事務2. session異常退出(包括數(shù)據(jù)庫崩潰)會令session未提交的事務回滾.3. session 正常退出 (輸入 exit/關閉終端窗口/輸入ctrl +D) 會隱式提交事務. 這個要注意啊
無論如何,要盡量避免事務的隱式的commit和rollback.
3事務的特性
事務包含4大特性ACID:
分別是:
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
持久性(Durability)
3.1 原子性(Atomicity):
??? 事務的原子性是指事務中所有的操作,要么都做, 要么都不做,保證數(shù)據(jù)庫是一致的.
??? 例如:? A賬戶向B賬戶劃賬1000蚊,? 則先將A減少1000,然后將B增加1000,這兩個動作要么都提交,要么都回滾,不能只提交1個另1個無效,否則數(shù)據(jù)總賬就變化了.
3.2 一致性(Consistency):
?????? 一致性是指數(shù)據(jù)庫在事務操作前和事務處理后, 其中的數(shù)據(jù)必須都滿足業(yè)務規(guī)則約束.
??????? 例如: A, B賬戶的總金額在轉帳前和和轉帳后必須一致,其中的不一致必須是短暫的,在事務提交后就會消失的.
??????? 再如: 約定B賬戶不能多余1000元, 則轉出1000成功, 而B賬戶轉入失敗, 最終由原子性得到---整個事務回滾.
3.3 隔離性(Isolation):
??????? 隔離性是指數(shù)據(jù)庫允許多個并發(fā)事務同時對數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行時導致數(shù)據(jù)的不一致.
???
??????? 例如: 在A,B 之間轉帳時, C同時向A轉帳,若同時進行則A B之間的一致性不能滿足,所以當A B事務執(zhí)行時,其他事務不能訪問(修改)當前相關的數(shù)據(jù).
3.4 持久性(Durabiity)
?????? 持久性表示為: 事務處理結束后,對數(shù)據(jù)的修改是永久的,即使系統(tǒng)故障也不會丟失
?????? 在提交啊之前如果系統(tǒng)故障,則所有信息全部丟失,提交后數(shù)據(jù)存放在磁盤中,是永久性的.
4.事務的隔離級別.
級別:(只能用普通用戶執(zhí)行)
(串行)? SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
commit;
SET TRANSACTION ISOLATION LEVEL READ COMMITED;(默認)
4.1 SET TRANSACTION ISOLATION LEVEL READ COMMITED;(默認)
我們知道默認的事務隔離級別是這樣的:
如上面HR 和 scott的例子
Session B見不到 Session A提交前修改的數(shù)據(jù), 但Session A一旦提交, B馬上就見到了.
4.2 (串行)SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
但是我們執(zhí)行上面那條語句后再試下:(用普通用戶執(zhí)行)
這時scott 執(zhí)行將事務隔離化設為串行:
?
?
這時HR 向cl_dept插入一條數(shù)據(jù):
?
這時Scott去查看這張表,當然是見不到HR未commit的新數(shù)據(jù)行的:
?
這時HR commit這條transaction:
?
再去scott那條session查看對應表, 發(fā)現(xiàn)即使hr commit了事務,? scott還是見不到修改后的數(shù)據(jù):
?
那什么時候scott才能看到Hr修改的數(shù)據(jù)呢,? 這時需要scott 執(zhí)行commit...
也就是說scott執(zhí)行了SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
之后,相當與自己開 1個事務, 在這個事務commit之前,? 他見不到其他session的任何的數(shù)據(jù)改動.
這個特性有時在不想見到數(shù)據(jù)改動的情況有用,例如提取數(shù)據(jù)做報表, 需要一定時間的靜態(tài)數(shù)據(jù).
?5.另外兩條 Set transaction 語句:
5.1 SET TRANSACTION? READ ONLY;
執(zhí)行了上面那個語句, 你就不能執(zhí)行DML語句了.. 也就是不能修改數(shù)據(jù).
除非你執(zhí)行rollback 或 commit;
5.1 SET TRANSACTION? READ WRITE;
這個是默認的,沒什么可說啦~
總結
以上是生活随笔為你收集整理的Oracle 事务概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle sql解析类型, 软解析和
- 下一篇: Oracle 杀死session的方法