ASE中事物的隔離級別 基本概念 強烈頂

2021-06-18 09:00:59 字數 3689 閱讀 5539

ansi sql

標準定義了

4種隔離級別,用來在併發環境中規定資料庫事務對資料所做的改變對於其他事物來說哪些是可見的,哪些是不可見的。事物的隔離級越高,併發能力越差、系統開銷越大。因此,在進行應用開發時,在滿足需求的前提下,最好使用低隔離級別。    

sap sybase ase資料庫支援ansi sql標準定義的全部4種隔離級別,從本文開始將向廣大sap sybase ase的初學者介紹事物和併發控制的知識。ase資料庫的事物和併發控制相對來說比較複雜,如果初學者不能正確掌握的話,開發出來的應用系統會遇到很多問題,比容效能和併發能力低等方面的問題。這篇文章將向初學者介紹ansi sql定義的4種事物隔離級別,本文近可能以簡單的語言描述並結合例子進行介紹。

1. read uncommitted

(隔離級別1,讀取

未提交資料

)事物在這種隔離級別下,允許讀取/訪問(看到)其他事物中尚未提交的資料修改。讀取未提交的資料,也被稱之為髒讀(dirty read)。通常情況下,很少使用這種隔離級別。

2. read committed(讀取提交資料

)在這種隔離級別下,事物只能訪問其他事物已經提交的資料修改。"讀提交"隔離級別雖然解決了「髒讀」問題,但是可能會遇到"不可重複讀"問題:"即乙個事物在先後兩次執行相同查詢語句所讀取到的資料值發生了不一致。這是由於在前後兩次執行相同語句期間,其它的事物對資料t.163.com進行了update或delete操作並且已經提交了事物而導致的"。例如:

事物ta執行如下操作:

begin transaction

.....

select balance from accounts where actno=1234567   --第一次讀取

.....

select balance from accounts where actno=1234567  --第二次讀取

....

commit 

事物ta在第1次執行查詢時得到賬號123567的餘額是1000;當他第2次執行相同查詢語句之前,事物tb執行了如下事物並提交:

begin transaction

......

update accounts set balance=balance+100 where actno=1234567

commit

這樣一來,事物ta第2次執行相同查詢時得到賬號1234567的餘額就是1100了,兩次查詢結果不一致,即遇到了"不可重複讀"問題!此外,如果事物tb執行了delete accounts where actno=1234567,那麼事物ta在第2次執行查詢時就會找不到對應記錄了event。

3. repeatable read(

可重複讀)

在這種隔離級別下,事物可以重複多次執行同一查詢,並且讀到的結果集中的任何一行記錄都不會被其他事物更新或刪除。這種隔離級別雖然解決了"不可重複讀"問題,但是可能會遇到"幻像讀 (phantom read)"問題:info"即當事物讀取滿足某一範圍條件的資料行時,另乙個事務又在該範圍內插入了新行,當事物再次讀取該範圍的資料行時,會發現有新的"幻像" 行"。例如:

eventid事物ta執行如下操作:

begin transaction

.....

--第一次讀取

select count(*) from accounts where balance>=1000 and balance <=3000  

.....

select count(*) from accounts where balance>=1000 and balance <=3000

....

commit 

事物ta在第1次執行查詢時得到賬戶餘額在1000和3000之間的賬戶數,假設為500;當他第2次執行相同查詢語句之前,事物tb執行那個了如下事物並提交:

begin transaction

......

insert into accounts(actno, balance) values (2222222,2000)

commit

這樣一來,事物ta第2次執行相同查詢時得到賬戶餘額在1000和3000之間的賬戶數就變為501個了,這樣兩次查詢結果不一致!這種不一致是由於insert語句扎入了滿足範圍條件的新記錄行導致的(注意與"不可重複讀"的區別)。

4. serializable(可序列化)

"可序列化"是ansi sql中定義的最高事物隔離級別。在這種隔離級別下,事物可以重複多次執行相同查詢,並且每次都能夠得到完全相同的結果。在這種隔離級別下,其他事物不能插入任何將出現在結果集中的記錄行,從而可以解決"幻像讀"問題(參見前面有關"幻像讀"的例子)。

讀取資料如下:

-2709363171357338787

8198153407774009605

-3487502777657169621

780058357012435560

-5000640981123956120

-2821494704275498339

-2425956167199689235

-9011993965288702187

1708607274409042905

6002422013389288836

-2064567574901603426

8674852667706047769

377931308804466091

2004615724147687284

-486574254389256041

8117756139014843207

-4497748372325528577

4517644586513436790

-2451289459080009547

3235176669837675122

-5777896639697768785

341018209886538040

-248752558554698112

3695141408112736151

-7997662361159449950

212821422613202010

-294409163655268084

4518187912517456276

-6258722245610832837

7555051128934922001

-2563812029577661172

-8987855923191418848

-6535855513250128448

7647637506402175787

-5999989679990946649

-524696247291654558

4519174811055014556

932422716846628974

298578870777511097

-4858117309282232497

3581843498415465799

-1130885605335979942

4263705493882513384

-1335960542939031169

-483360142662101861

7167819713847047518

7219827211832149163

8679748020396397022

1566921127311075439

8974460389557478243

執行完畢,效果顯而易見。大家看看。

事務的基本概念以及隔離級別

1.1 事務 所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的單位。例如,在關係型資料庫中,乙個事務可以是一條sql語句 一組sql語句或者整個程式。在sql中,定義事務的語句一般有三條 begin transaction commit rollback 事務...

事物的隔離級別

1 髒讀 最嚴重,杜絕發生 2 不可重複讀 3 幻讀 虛讀 假設a向b轉賬100元,對應的sql語句如下 開啟事務 update account set money money 100where name a update account set money money 100where nam b...

事物的隔離級別

sql 事務隔離級別 概述 隔離級別用於決定如果控制併發使用者如何讀寫資料的操作,同時對效能也有一定的影響作用。步驟 事務隔離級別通過影響讀操作來間接地影響寫操作 可以在回話級別上設定事務隔離級別也可以在查詢 表級別 級別上設定事務隔離級別。事務隔離級別總共有6個隔離級別 read uncommit...