自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle事務(wù)在管理中的問題有哪些?

數(shù)據(jù)庫 Oracle
以下的文章主要講述的是Oracle事務(wù)的管理問題的總結(jié),其中包括PL/SQL的執(zhí)行在實(shí)際操作中是如何管理并發(fā)與恢復(fù)控制,Oracle死鎖產(chǎn)生的原因的分析。

我們大家都知道如果一個(gè)Oracle事務(wù)里包含N多個(gè)相關(guān)的操作語句,而在此時(shí)實(shí)際操作中已對(duì)其中的幾個(gè)進(jìn)行了執(zhí)行,也可以同時(shí)執(zhí)行某個(gè)語句,那么我們就不能簡單的認(rèn)為前面幾個(gè)執(zhí)行的操作語句也還沒發(fā)生。

這是要看Oracle事務(wù)的隔離級(jí)別的,但是不管事務(wù)隔離級(jí)別是幾級(jí),語句級(jí)別上可以認(rèn)為是序列執(zhí)行的。

該sql語句的操作過程中認(rèn)為此數(shù)據(jù)狀態(tài)是保持不變的。當(dāng)此操作執(zhí)行結(jié)束時(shí)刻,才產(chǎn)生語句級(jí)數(shù)據(jù)狀態(tài)影響。就是說,可能該語句同時(shí)更新了兩行,但都用了同一個(gè)主鍵,則此時(shí)會(huì)導(dǎo)致違反***性約定而消除整個(gè)語句的影響,如果成功執(zhí)行,但未必就在事務(wù)級(jí)別上影響數(shù)據(jù)狀態(tài),就是說如果所在Oracle事務(wù)回滾,此影響仍然被消除,不過正如前面所說,一個(gè)語句成功執(zhí)行后,就可能影響其他語句所面對(duì)的數(shù)據(jù)狀態(tài)。

PL/SQL的執(zhí)行是怎么管理并發(fā)和恢復(fù)控制的?

PL/SQL是在一個(gè)PL/SQL引擎中執(zhí)行的。該引擎可以認(rèn)為是oracle之外的單位。該引擎會(huì)解析PL/SQL,并不斷發(fā)送SQL語句給ORACLE。所以和用JAVA程序通過JDBC在一個(gè)會(huì)話連接中發(fā)送多個(gè)SQL語句沒有本質(zhì)差別。也因此并發(fā)和恢復(fù)管理沒有不同。

Oracle死鎖是怎么樣產(chǎn)生的?

由于oracle控制并發(fā)是使用的鎖機(jī)制,也因此即會(huì)產(chǎn)生死鎖問題。oracle在執(zhí)行一個(gè)語句時(shí),會(huì)根據(jù)語句的含義,同時(shí)根據(jù)所處的事務(wù)隔離級(jí)別,解析出需要加什么樣的鎖,什么時(shí)候釋放。而隔離級(jí)別越高,對(duì)鎖資源占用越大?,F(xiàn)在考慮這樣的情形,oracle同時(shí)處理兩個(gè)Oracle事務(wù)A,B。

A發(fā)過來幾條語句,導(dǎo)致ORACLE加了幾把鎖沒有釋放,B發(fā)過來幾條語句,導(dǎo)致ORACLE加了另外幾把鎖沒有釋放,現(xiàn)在,A又發(fā)過來一個(gè)語句,此語句要求ORACLE加的一些鎖中,有幾個(gè)鎖已經(jīng)被B事務(wù)占用,那么A等待,而B又發(fā)過來一條語句,此語句要求ORACLE加的鎖,在A手中。于是死鎖出現(xiàn)。

而隔離級(jí)別越高,死鎖的可能性越大。可以分析出來,死鎖的根本原因在于,Oracle事務(wù)包含的語句是分條發(fā)給oracle的,oracle不能夠在事務(wù)開始時(shí)刻就解析出全部執(zhí)行過程需要什么鎖,什么時(shí)候釋放,無法統(tǒng)一安排。

死鎖問題歸咎由誰呢?我這么理解:如果沒有事務(wù)概念,oracle在語句級(jí)上控制并發(fā),完全不會(huì)出現(xiàn)死鎖問題。因?yàn)樵诮馕稣Z句時(shí),oracle已經(jīng)知道要加多少把鎖,它會(huì)看目前這些鎖如果能全部獲得就執(zhí)行,否則就等待。

可是實(shí)際應(yīng)用怎么能沒有事務(wù)的概念呢?我同意完全可以出現(xiàn)新的sql語法,可以把原來的多條sql語句的含義在一個(gè)語句中定義完畢,長短不是問題,犧牲一定的語法簡潔度也不是問題;然而最關(guān)鍵的是往往我們是在一個(gè)業(yè)務(wù)處理邏輯中,多個(gè)數(shù)據(jù)庫操作之間摻雜了其他非數(shù)據(jù)庫操作,而又想獲取這些數(shù)據(jù)庫操作作為一個(gè)整體的ACID。

因此事務(wù)概念必須存在。既然如此,或許我們真得可以把一個(gè)Oracle事務(wù)可能包含的語句在事務(wù)開始時(shí)就交給oracle,盡管這樣一來,有可能就包含了實(shí)際通過業(yè)務(wù)邏輯判斷不會(huì)執(zhí)行的語句,導(dǎo)致oracle浪費(fèi)鎖,降低并發(fā)處理能力。

我之前的文章曾經(jīng)介紹過用JAVA實(shí)現(xiàn)同步控制,降低ORACLE隔離級(jí)別,只利用ORACLE的原子性支持。這樣做的原因就在上文中基本提到了。我們?cè)诰帉慗AVA業(yè)務(wù)邏輯時(shí),是知道我們需要在一串業(yè)務(wù)邏輯中操作多少次數(shù)據(jù)庫的,也因此,能夠在業(yè)務(wù)邏輯開始時(shí)就控制得到所有的鎖再執(zhí)行。這樣做確實(shí)能夠降低oracle壓力,并消除死鎖問題,然而這樣做會(huì)導(dǎo)致同步壓力集中到JAVA應(yīng)用端,而且對(duì)研發(fā)人員要求也會(huì)提高。

盡管如此,在JAVA應(yīng)用端使用同步要靈活很多,而不必限制在表鎖行鎖,你甚至可以建一個(gè)森林結(jié)構(gòu)的信號(hào)量數(shù)據(jù)來控制同步。

呵呵,反過來也可以理解隔離級(jí)別的問題,為什么要存在允許幻像讀的隔離級(jí)別呢?隔離級(jí)別的存在是一種權(quán)衡,如果應(yīng)用既不想自己控制并發(fā),又想提高并發(fā)能力,則需要好好權(quán)衡一下吧!

【編輯推薦】

  1. Oracle字符集中的一些問題總結(jié)
  2. Oracle修改相關(guān)字段的幾種常用方法
  3. Oracle分頁查詢語句的實(shí)際應(yīng)用
  4. 實(shí)現(xiàn)異地Oracle數(shù)據(jù)庫的數(shù)據(jù)同步步驟
  5. Oracle數(shù)據(jù)比較的兩大妙招

 

責(zé)任編輯:佚名 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-04-21 09:12:56

Oracle JDBC

2010-04-09 09:46:38

Oracle RAC

2010-05-04 18:00:56

Oracle事務(wù)

2010-03-29 13:33:27

Oracle模式

2022-08-27 14:14:06

Spring事務(wù)開發(fā)

2010-05-07 17:56:10

Oracle數(shù)據(jù)庫安全

2010-05-05 13:56:09

Oracle常見問題

2010-05-05 10:49:34

Oracle 復(fù)合類型

2010-04-20 09:06:25

Oracle優(yōu)化

2010-04-21 08:50:08

2023-07-03 14:11:06

預(yù)測分析

2010-04-21 10:04:33

Oracle移植

2010-04-16 09:03:28

Oracle 存儲(chǔ)過程

2010-04-06 17:36:15

Oracle數(shù)據(jù)字典

2022-09-22 09:57:20

Spring事務(wù)失效

2010-04-15 10:34:16

Oracle程序開發(fā)

2010-04-28 12:24:56

Oracle數(shù)據(jù)庫

2010-05-07 18:44:28

Oracle存儲(chǔ)過程

2010-04-21 14:11:56

Oracle數(shù)據(jù)庫

2010-06-17 15:17:24

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)