Oracle事務(wù) 行級鎖 保存點 回滾 提交 |
發(fā)布時間: 2012/9/5 17:36:02 |
Oracle事務(wù) 一般事務(wù)(DML)即數(shù)據(jù)修改(增、刪、改)的事務(wù) 舉個例子:- 當(dāng)A操作一條數(shù)據(jù)N1后,暫未提交事務(wù) ,此時B又上來操作同一條數(shù)據(jù)N1,這時的情況是: 由上可以看出,對同一條數(shù)據(jù)的事務(wù)處理,必須按先后順序進(jìn)行。 這里注意一點,這里所說有A與B并不是指二個Oracle帳戶,而是二個連接會話。上面只是為了方便舉例。 在PS/SQL中,對數(shù)據(jù)修改完后,如果用戶未提交事務(wù),但關(guān)閉或斷開了PS/SQL,此時Oracle會立即提交此會話的事務(wù)。 我們可以事務(wù)中使用保存點來回滾到指定的時間節(jié)點上來,但如果用提交事務(wù)(commit)后,所有保存點將被刪除。 舉個舉子: savepoint a1; --設(shè)置一個保存點 a1; update tmp set username='張三' where userid='101' --修改一條數(shù)據(jù) savepoint a2; --設(shè)置一個保存點 a1; update tmp set username='李四' where userid='102 --再修改一條數(shù)據(jù)
rollback to a2; --回滾到a2 保存點。 此時在 a2 保存點之后的所有數(shù)據(jù)修改視為無效。 rollback to a1; --這里可以再從a2保存點再回滾到a1 保存點。 此時在 a1 保存點之后的所有數(shù)據(jù)修改視為無效。 rollback; --回滾全部。即撤消至上一次提交事務(wù)后的所有數(shù)據(jù)修改。 commit; --提交事務(wù) 將回滾后的事務(wù)提交,并會刪除所有保存點。 注意:我們可以從a2向前再回滾到a1 ,但無法從a1回滾到a2。也就是只能向前回滾,不能從前面的點再向后回滾! 只讀事務(wù) 即,只用于select 查詢的事務(wù) 只讀事務(wù)主要用于在某一個時間點對數(shù)據(jù)的查詢統(tǒng)計。如:在18:00創(chuàng)建一個只讀事務(wù),然后可以開始統(tǒng)計某張表的記錄數(shù)。此時18:00之后新添加到這張表中的數(shù)據(jù)就不會進(jìn)入到統(tǒng)計中去。也就是創(chuàng)建只讀事務(wù)的會話連接人,將無法看到在創(chuàng)建只讀事務(wù)之后其它任何人對數(shù)據(jù)的真實修改。 方法是: set transaction read only; --在此之后,擁有此會話的連接人將無法看到其它人對數(shù)據(jù)的任何改動。用戶可以用select 進(jìn)行此時間點的統(tǒng)計查詢 set transaction read write; --取消只讀事務(wù) 只讀事務(wù)沒有回滾和提交的功能也不記錄回滾LOG。 只讀事務(wù)最大的用處是保證在某個時間點查詢結(jié)果的一致性。換句話說,如果你要統(tǒng)計很多信息,有多個select查詢時,但你執(zhí)行完第一個查詢后(如用戶信息統(tǒng)計),可能其它人進(jìn)來修改了某些數(shù)據(jù)你正在查詢的數(shù)據(jù)。這時你再進(jìn)行第二個查詢(如用戶信息的統(tǒng)計或其它有關(guān)用戶信息的查詢)。這時候?qū)⒊霈F(xiàn)數(shù)據(jù)查詢結(jié)果的不一致,第二次查詢的結(jié)果會由于數(shù)據(jù)被修改了而與第一次查詢結(jié)果一不樣。只讀事務(wù)正是解決這類問題的辦法。 其實Oracle為了優(yōu)化查詢在對于單條查詢時也會啟動只讀事務(wù)(就是在你開始執(zhí)行查詢時會有一個只讀事務(wù)點,到查詢結(jié)束前,在這期間的數(shù)據(jù)修改都被無視掉),你無須手動創(chuàng)建只讀事務(wù)。但多條查詢時我們就必須手動創(chuàng)建只讀事務(wù)。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |