實施Oracle事務相關管理問題的總結
以下的文章主要介紹的實施Oracle事務管理的相關問題的總結,前兩天在相關網(wǎng)站看見實施Oracle事務管理的相關問題的資料,覺得挺好,就拿出來供大家分享。實施Oracle事務管理的相關問題。
該SQL語句的操作過程中認為此數(shù)據(jù)狀態(tài)是保持不變的。當此操作執(zhí)行結束時刻,才產(chǎn)生語句級數(shù)據(jù)狀態(tài)影響。就是說,可能該語句同時更新了兩行,但都用了同一個主鍵,則此時會導致違反***性約定而消除整個語句的影響,如果成功執(zhí)行,但未必就在Oracle事務級別上影響數(shù)據(jù)狀態(tài),就是說如果所在Oracle事務回滾,此影響仍然被消除,不過正如前面所說,一個語句成功執(zhí)行后,就可能影響其他語句所面對的數(shù)據(jù)狀態(tài)。51CTO數(shù)據(jù)庫頻道向您推薦《Oracle數(shù)據(jù)庫調(diào)試與性能優(yōu)化》專題。
PL/SQL的執(zhí)行是怎么管理并發(fā)和恢復控制的?
PL/SQL是在一個PL/SQL引擎中執(zhí)行的。該引擎可以認為是Oracle之外的單位。該引擎會解析PL/SQL,并不斷發(fā)送SQL語句給Oracle。所以和用Java程序通過JDBC在一個會話連接中發(fā)送多個SQL語句沒有本質(zhì)差別。也因此并發(fā)和恢復管理沒有不同。
Oracle死鎖是怎么樣產(chǎn)生的?
由于Oracle控制并發(fā)是使用的鎖機制,也因此即會產(chǎn)生死鎖問題。Oracle在執(zhí)行一個語句時,會根據(jù)語句的含義,同時根據(jù)所處的Oracle事務隔離級別,解析出需要加什么樣的鎖,什么時候釋放。而隔離級別越高,對鎖資源占用越大?,F(xiàn)在考慮這樣的情形,Oracle同時處理兩個事務A,B。
A發(fā)過來幾條語句,導致Oracle加了幾把鎖沒有釋放,B發(fā)過來幾條語句,導致Oracle加了另外幾把鎖沒有釋放,現(xiàn)在,A又發(fā)過來一個語句,此語句要求Oracle加的一些鎖中,有幾個鎖已經(jīng)被B事務占用,那么A等待,而B又發(fā)過來一條語句,此語句要求Oracle加的鎖,在A手中。
于是死鎖出現(xiàn)。而隔離級別越高,死鎖的可能性越大。可以分析出來,死鎖的根本原因在于,Oracle事務包含的語句是分條發(fā)給Oracle的,Oracle不能夠在事務開始時刻就解析出全部執(zhí)行過程需要什么鎖,什么時候釋放,無法統(tǒng)一安排。
死鎖問題歸咎由誰呢?我這么理解:如果沒有事務概念,Oracle在語句級上控制并發(fā),完全不會出現(xiàn)死鎖問題。因為在解析語句時,Oracle已經(jīng)知道要加多少把鎖,它會看目前這些鎖如果能全部獲得就執(zhí)行,否則就等待??墒菍嶋H應用怎么能沒有Oracle事務的概念呢?
我同意完全可以出現(xiàn)新的sql語法,可以把原來的多條sql語句的含義在一個語句中定義完畢,長短不是問題,犧牲一定的語法簡潔度也不是問題;然而最關鍵的是往往我們是在一個業(yè)務處理邏輯中,多個數(shù)據(jù)庫操作之間摻雜了其他非數(shù)據(jù)庫操作,而又想獲取這些數(shù)據(jù)庫操作作為一個整體的ACID。
因此事務概念必須存在。既然如此,或許我們真得可以把一個Oracle事務可能包含的語句在事務開始時就交給Oracle,盡管這樣一來,有可能就包含了實際通過業(yè)務邏輯判斷不會執(zhí)行的語句,導致Oracle浪費鎖,降低并發(fā)處理能力。
我之前的文章曾經(jīng)介紹過用Java實現(xiàn)同步控制,降低Oracle隔離級別,只利用Oracle的原子性支持。這樣做的原因就在上文中基本提到了。我們在編寫Java業(yè)務邏輯時,是知道我們需要在一串業(yè)務邏輯中操作多少次數(shù)據(jù)庫的,也因此,能夠在業(yè)務邏輯開始時就控制得到所有的鎖再執(zhí)行。
這樣做確實能夠降低Oracle壓力,并消除死鎖問題,然而這樣做會導致同步壓力集中到Java應用端,而且對研發(fā)人員要求也會提高。盡管如此,在Java應用端使用同步要靈活很多,而不必限制在表鎖行鎖,你甚至可以建一個森林結構的信號量數(shù)據(jù)來控制同步。
呵呵,反過來也可以理解隔離級別的問題,為什么要存在允許幻像讀的隔離級別呢?隔離級別的存在是一種權衡,如果應用既不想自己控制并發(fā),又想提高并發(fā)能力,則需要好好權衡一下吧!
【編輯推薦】
- Oracle修改字段類型2種方案介紹
- Oracle數(shù)據(jù)文件的特性介紹
- Oracle臨時表用法的經(jīng)驗心得
- Oracle表中數(shù)據(jù)導出成 Txt格式的方案
- Oracle通過其實際存儲過程中返回相關數(shù)據(jù)集