天天看點

Oracle資料庫-并發控制

為什麼要進行并發控制

三種典型的由并發事務引起的資料不一緻現象:

1.丢失修改:

  以購票為例,一次購票過程中,剩餘票數這個字段需要被讀取,更新(x=x-1),寫入。兩個人A、B同時購票,B在A寫入新的票數之前讀取了票數,則讀取的值和A的一樣,B和A最終寫入的都是同一個值,是以系統售出了2張票,而剩餘票數字段隻減了1,丢失了一次修改結果。

2.不可重複讀:

  是指在資料庫通路中,一個事務範圍内兩個相同的查詢卻傳回了不同資料。

  一種更易了解的說法是:在一個事務内,多次讀同一個資料。在這個事務還沒有結束時,另一個事務修改了該資料。那麼,在第一個事務的兩次讀資料之間。由于第二個事務的修改,那麼第一個事務讀到的資料可能不一樣,這樣就發生了在一個事務内兩次讀到的資料是不一樣的,是以稱為不可重複讀,即原始讀取不可重複。

3.髒讀:

  簡單地說就是事務A讀取到了事務B修改了但還沒送出的資料,然後B将該事務復原了,該資料變成修改前的狀态,這時事務A在記憶體中的資料就是已失效的錯誤資料,即髒讀。

  

什麼是事務

  DBMS(資料庫管理系統)中的事務是指DBMS提供的控制資料操作的一種手段,通過事務,将一系列的資料庫基本操作組合在一起作為整體進行操作和控制,進而保證資料一緻性。

  

  例如:“銀行轉賬”事務T:從帳戶A轉賬5000RMB到帳戶B上

read(A);
A:=A-;
write(A);
read(B);
B:=B+;
write(B);
           

  如果不使用DBMS的事務,上述過程順序執行,如果執行到一半就異常退出,則可能發生A帳戶減少5000元,而B帳戶餘額沒變的情況,造成損失。而DBMS的事務管理可以保證得到的要麼是上述語句全執行的結果,要麼是全不執行的結果。

  

  事務的宏觀性(應用程式員看到的):

  一個存取或改變資料庫内容的程式的一次執行,或者說一條或多條SQL語句的一次執行,被看作一個事務

  事務的微觀性(DBMS看到的):

  對資料庫的一系列基本操作(讀、寫)的一個整體性執行

  事務并發執行:多個事務從宏觀上看是同時執行的,但其微觀上的基本操作則可以是交叉執行的(事務A讀資料-事務B讀資料-A修改資料-B修改資料-A寫資料-B寫資料)。資料不一緻現象就是由于并發事務微觀操作的次序安排不正确産生的。

是以,并發控制就是通過事務微觀交錯執行順序的正确安排,保證事務宏觀上的獨立性、完整性和正确性。

(DBMS中)事務的特性:ACID

  1.原子性(Atomicity):DBMS能夠保證事務的一組更新操作是原子不可分的,即對DB而言,要麼全執行,要麼全不執行。

  2.一緻性(Consistency):DBMS保證事務的操作狀态是正确的,符合一緻性操作規則,不能出現資料不一緻現象。它其實是由隔離性來保證的。

  3.隔離性(Isolation):DBMS保證并發執行的多個事務之間不受影響,即使并發執行,也相當于先執行了一個,再執行下一個。

  4.持久性(Durability):DBMS保證已送出事務的影響是持久的(寫到了磁盤上,不能丢失),被撤銷事務的影響是可恢複的(事務被撤銷了以後,對磁盤上的資料是沒有影響的)。

  DBMS通過事務管理器來産生事務,并對事務的時間戳進行管理,管理事務的一系列微觀操作。通過事務排程器對所有事務的操作産生一個讀寫操作的合理序列(即排程),保證事務的一緻性。

事務排程與可串行性

  首先介紹一種表達事務排程的模型

  其中: rT(A) r T ( A ) :事務T讀A, wT(A) w T ( A ) :事務T寫A 例:    T1:r1(A);w1(A);r1(B);w1(B) 例 :         T 1 : r 1 ( A ) ; w 1 ( A ) ; r 1 ( B ) ; w 1 ( B )

  表示 T1 T 1 事務中發生了“讀A-寫A-讀B-寫B”的過程。

  通過這種模型,可以判斷事務是不是可串行化的。

沖突可串行性

  沖突:排程中一對連續的動作,如果它們的順序交換,那麼涉及的事務中至少有一個事務的行為會改變,那麼稱他們是沖突的。

  是以,有沖突的兩個操作是不能交換次序的,沒有沖突的兩個事務是可以交換的。

  幾種沖突的情況:

  1.同一事務的任何兩個操作都是沖突的,因為事務是由應用程式員制定好的,操作順序不能改變。

  

  2.不同僚務對同一進制素的兩個寫操作是沖突的,即 wi(X);wj(X) w i ( X ) ; w j ( X ) ,如果調換順序,寫入的最終内容就發生改變了。

  3.不同僚務對同一進制素的一讀一寫操作是沖突的,如 ri(X);wj(X) r i ( X ) ; w j ( X ) ,先讀X再寫X,與先寫X再讀X,讀到的内容會不同。

  

沖突可串行性:

一個排程,如果通過交換相鄰兩個無沖突的操作能夠轉換到某一個串行的排程,則稱此排程為沖突可串行化的排程。例如:    r1(A);w1(A);r2(A);w2(A);r1(B);w1(B);r2(B);w2(B) r 1 ( A ) ; w 1 ( A ) ; r 2 ( A ) ; w 2 ( A ) ; r 1 ( B ) ; w 1 ( B ) ; r 2 ( B ) ; w 2 ( B )

  是一個典型的并發排程,通過以下四步對操作次序的轉換,可以得到串行的排程:    r1(A);w1(A);r2(A);r1(B);w2(A);w1(B);r2(B);w2(B) r 1 ( A ) ; w 1 ( A ) ; r 2 ( A ) ; r 1 ( B ) ; w 2 ( A ) ; w 1 ( B ) ; r 2 ( B ) ; w 2 ( B )

   r1(A);w1(A);r1(B);r2(A);w2(A);w1(B);r2(B);w2(B) r 1 ( A ) ; w 1 ( A ) ; r 1 ( B ) ; r 2 ( A ) ; w 2 ( A ) ; w 1 ( B ) ; r 2 ( B ) ; w 2 ( B )

   r1(A);w1(A);r1(B);r2(A);w1(B);w2(A);r2(B);w2(B) r 1 ( A ) ; w 1 ( A ) ; r 1 ( B ) ; r 2 ( A ) ; w 1 ( B ) ; w 2 ( A ) ; r 2 ( B ) ; w 2 ( B )

  可見,最後一步變成了串行化的排程,先執行事務1,再執行事務2:    r1(A);w1(A);r1(B);w1(B);r2(A);w2(A);r2(B);w2(B) r 1 ( A ) ; w 1 ( A ) ; r 1 ( B ) ; w 1 ( B ) ; r 2 ( A ) ; w 2 ( A ) ; r 2 ( B ) ; w 2 ( B )

  沖突可串行性是比可串行性嚴格的概念,滿足沖突可串行性,一定滿足可串行性,反之不然。例如:    w1(Y);w2(Y);w2(X);w1(X);w3(X) w 1 ( Y ) ; w 2 ( Y ) ; w 2 ( X ) ; w 1 ( X ) ; w 3 ( X )

  顯然不是滿足沖突可串行性的,但是如果把 w1(X) w 1 ( X ) 移到第二個位置,實際上最後寫X的還是 w3(X) w 3 ( X ) ,結果不變,是以這個操作雖然引起沖突,但 也是可串行化的

  并發排程的正确性:當且僅當在這個并發排程下所得到的新資料結果與分别串行地運作這些事務所得到的新資料完全一緻,則說排程是正确的。