交易處理和並發控制,交易處理並發控制

來源:互聯網
上載者:User

交易處理和並發控制,交易處理並發控制

什麼是事務

是一種機制、一個操作序列、它包含了一組資料庫操作命令,並且所有的命令作為一個整體,一起向系統提交或撤銷操作請求。由一個或多個完成一種相關行為的SQL語句組成。是一個不可分割的工作邏輯單元。

在交易處理中,一旦某個操作發生異常,則整個事務都會重新開始,資料庫也會返回到事務開始之前的狀態,在事務中對資料庫所做的一切操作都會取消。事務要是成功的話,事務中所有的操作都會執行。

事務控制語句:COMMIT:提交事務,即把事務中對資料庫的修改進行永久儲存。

ROLLBACK:復原事務,即取消對資料庫所做的任何修改。

事務的特性:1、原子性(Atomicity):事務是一個完整的操作。事務的各步操作是不可分的(原子的),要麼都執行,要麼都不執行。2、一致性(Consistency):在事務操作前後,資料必須處於一致狀態。3、隔離性(Isolation):對資料進行修改的所有並發事務彼此隔離的,這表明事務必須是獨立的,他不應該以任何方式依賴於或影響其他事務。4、持久性(Durability):事務完成後,他對資料的修改被永久保持。

樣本:ACCOUNT_BALANCE表示使用者餘額ACCOUTN_ID表示使用者id。

BEGIN UPDATE ACCOUNT SETACCOUNT_BALANCE=ACCOUNT_BALANCE-4000;       WHERE ACCOUNT_ID=’1001’; UPDATE ACCOUNT SETACCOUNT_BALANCE=ACCOUNT_BALANCE+4000;       WHERE ACCOUNT_ID=’1002’;COMMIT;EXCEPTION       WHERE OTHERS THEN ROLLBACK;DBMS_OUTPUT.PUT_LINE(‘轉賬異常,停止轉賬!’);END;

事務一致性要求:在交易處理開始之前,資料庫的所有資料都滿足商務規則約束;當交易處理結束後,資料庫中的所有資料仍然滿足商務規則約束。

樣本:

DECLARE       account_a ACCOUNT.ACCOUNT_BALANCE%TYPE;       account_b ACCOUNT.ACCOUNT_BALANCE%TYPE;BEGIN       SELECT ACCOUNT_BALANCE INTO account_aFROM ACCOUNT WHERE ACCOUNT_ID=’1001’;       SELECT ACCOUNT_BALANCE INTO account_bFROM ACCOUNT WHERE ACCOUNT_ID=’1002’;       dbms_output.put_line(‘轉賬前A金額:’);       dbms_output.put_line(account_a);       dbms_output.put_line(‘轉賬前B的金額:’);       dbms_output.put_line(account_b);       dbms_output.put_line(‘轉賬前總金額:’);       dbms_output.put_line(account_a+account_b);       UPDATE ACCOUNT SETACCOUNT_BALANCE=ACCOUNT_BALANCE-2000WHERE ACCOUNT_ID=’1001’;       UPDATE ACCOUNT SETACCOUNT_BALANCE=ACCOUNT_BALANCE+2000WHERE ACCOUNT_ID=’1002’;       COMMIT;       dbms_output.put_line(‘成功轉賬!’);       SELECT ACCOUNT_BALANCE INTO account_aFROM ACCOUNT WHERE ACCOUNT_ID=’1001’;       SELECT ACCOUNT_BALANCE INTO account_bFROM ACCOUNT WHERE ACCOUNT_ID=’1002’;       dbms_output.put_line(‘轉賬後A金額:’);       dbms_output.put_line(account_a);       dbms_output.put_line(‘轉賬後B金額:’);       dbms_output.put_line(account_b);       dbms_output.put_line(‘轉賬後總金額:’);       dbms_output.put_line(account_a+account_b);       EXCEPTION WHEN OTHERS THEN ROLLBACK;       dbms_output.put_line(‘轉賬異常,停止轉賬!’);       SELECT ACCOUNT_BALANCE INTO account_aFROM ACCOUNT WHERE ACCOUNT_ID=’1001’;       SELECT ACCOUNT_BALANCE INTO account_bFROM ACCOUNT WHERE ACCOUNT_ID=’1002’;       dbms_output.put_line(‘停止轉賬後A金額:’);       dbms_output.put_line(account_a);       dbms_output.put_line(‘停止轉賬後B金額:’);       dbms_output.put_line(account_b);       dbms_output.put_line(‘停止轉賬後總金額:’);       dbms_output.put_line(account_a+account_b);END;

讀取異常的情況:1、髒讀:一個事務讀取了另一個事務未提交的資料。2、不可重複讀取,一個事務在次讀取之前曾讀取過的資料時,發現該資料已經被另一個已提交的事務修改。3、幻讀:一個事務根據相同的查詢條件,重新執行查詢,返回的記錄中包含與前一次執行查詢返回的記錄不同的行。

ANSISQL-92標準中定義的交易隔離等級:

ReadUncommitted最低等的事務隔離,它僅僅保證了讀取過程中不會讀取到非法資料,

ReadCommitted,此層級的書屋隔離保證了一個事務不會讀到另一個並行事務已修改但未提交的資料,也就是說此層級的事務層級避免了“髒讀”。

RepeatableRead,此層級的事務隔離避免了“髒讀”和“不可重複讀取”異常現象的出現。這也意味著,一個事務不可能更新已經由另一個事務讀取但未提交的資料。可能引發幻讀。

Serializable,最高等級的隔離等級,提供了最高等級的隔離機制,三種異常情況都能避免。

隔離等級

髒讀

不可重複讀取

幻讀

Read  Uncommitted

可能

可能

可能

Read  Committde

不可能

可能

可能

Repeatable  Read

不可能

不可能

可能

Serializable

不可能

不可能

不可能

Oracle的交易隔離等級:1、ReadCommitted。2、Serializable;

3、Read Only是Serialzable的子集,但事務中不能有任何修改資料庫中資料的語句(DML),以及修改資料庫結構的語句(DDL);

 

 

 

Oracle中不需要專門的語句來開始事務。隱含的,事務會在修改資料的第一條魚具處開始。

結束事務:1、COMMIT語句顯式終止一個事務。當執行COMMIT語句時,在事務中對資料的修改都會儲存到資料庫中。2、ROLLBACK語句復原事務,當執行ROLLBACK語句時,將取消在事務中對資料庫所做的任何修改。3、執行一條DDL語句,如果DDL語句前已經有DML語句,則Oracle會把前面的DML語句作為一個事務提交。4、使用者斷開與Oracle的連結,使用者當前事務將被自動認可。5、使用者進程意外被終止,這時使用者當前的事務被復原。

事務控制語句:1、COMMIT:提交事務,即把事務中對資料庫的修改進行永久儲存。2、ROLLBACK:復原事務,即取消對資料庫所做的任何修改。3、SAVEPOINT:在事務中建立儲存點。4、ROLLBACKTO<SAVEPOINT_NAME>:將交易回復到儲存點。5、SET TRANSACTION:設定事務的屬性。

SAVEPOINT:在事務中建立儲存點。文法:SAVEPOINT[SavePoint_Name];

ROLLBACKTO<SavePoint_Name>:將交易回復到儲存點。文法:ROLLBACK TO[SavePoint_Name];

樣本:

BEGINUPDATE ACCOUNT SETACCOUNT_BALANCE=ACCOUNT_BALANCE+2000 WHEN ACCOUNT_ID=’1001’;SAVEPOINT Add_Account_A;UPDATE ACCOUNT SET ACCOUNT_BALANCE= ACCOUNT_BALANCE-6000 WHEN ACCOUNT_ID=’1001’;UPDATE ACCOUNT SETACCOUNT_BALANCE=ACCOUNT_BALANCE+6000 WHEN ACCOUNT_ID=’1002’;COMMIT;EXCEPTION     WHENOTHERS THEN dbms_output.put_line(‘轉賬異常!’);     ROLLBACK TO Add_Account_A;END;

SETTRANSACTION語句必須是事務的第一條語句,他可以指定事務的隔離等級、規定復原事務時所使用的儲存空間、對事務命名。

設定存取層級的方法:SET TRANSACTION READ ONLY;   SET TRANSACTION ISOLATION LEVEL READCOMMITED;          SET TRANASCTION ISOLATION LEVEL SERIALIZABLE;

並發控制:指用正確的方式實現事務的並行作業,避免造成資料的不一致。

並發控制帶來的問題:1、丟失更新,一個事務修改某行資料時,另一個事務同時修改了該行資料,使第一個事務對資料的修改丟失。2、髒讀。3、不可重複讀取。4、幻讀。

鎖的基本概念:鎖,用來共用資源控制並發訪問的一種機制。鎖由Oracle自動管理,鎖持續的時間等於被提交交易處理的時間。

鎖的類型:1、共用鎖定(使用共用鎖定的資料對象可以被其他事務讀取,但不能修改),也稱s鎖。2、獨佔鎖定,也稱x鎖。按鎖保護的內容分類:DML鎖,用來保護資料的完整性和一致性;DDL鎖,用來保護資料對象結構定義;內部鎖和閂,用來保護資料庫內部資料結構。

死結:兩個事務(會話)都進入了彼此等候對方鎖定資源時的一種停止狀態。

解決死結:“犧牲”一個會話,復原一個會話事務,使另一個會話的事務繼續執行。

在發生死結時Oracle資料庫會在伺服器上建立一個追蹤檔案記錄死結。

注意:不要在開發過程中人為的提供條件使Oracle產生死結。

阻塞:如果一個會話持有某個資源的鎖,而另一個會話在請求這個資源就造成了阻塞。

鎖機制問題:1、悲觀鎖,是指在讀取資料後馬上鎖定相關資源。文法:SELECT…………FORUPDATE[OF column_list][WAIT n|NOWAIT]    OF子句用於指定即將更新的列,即鎖定行上的特定列;WAIT子句指定等待其他使用者釋放的秒數,防止無限期的等待,NOWAIT表示不等待。

樣本:

SELECT * FROM ACCOUNT WHEREACCOUNT .ID=’1001’ FOR UPDATE;UPDATE ACCOUNT SETBALANCE=BALANCE-500 WHERE ID=’1001’;

樂觀鎖:把所有鎖定都延遲到即將執行更新之前。

文法:

UPDATE Table_Name SETColumn_Name1=NewValue1,Column_Name2=NewValue2……WHERE Column_Name1=OldValue1 ANDColumn_Name2=OldValue2……

樣本:

DECLARE  account_a ACCOUNT.BALANCE%TYPE;BEGIN       SELECT balance INTO account_a FROMACCOUNT WHERE ID=’1001’;       UPDATE ACCOUNT SET balance=balance-500WHERE ID=’1001’ AND BALANCE=account_a;END;

鎖的分類:DML鎖用於確保一次只有一個使用者能修改一行,而且正在處理一個表時,別人也不能刪除這張表。

DML鎖主要包括TX鎖、TM鎖,其中TX鎖是事務鎖或行級鎖,TM鎖成為表級鎖。

TX鎖:事務發起第一個修改資料的語句時會自動得到TX鎖,而且會一直持有這個鎖,知道事務提交或復原。TX鎖用作一種排隊機制,使得其他會話可以等待這個事務執行。事務中修改或通過悲觀鎖定選擇的每一行都會指向該事務的一個相關TX鎖。

TM鎖:用於確保在修改表的內容是,表的結構不會改變當一個會話開始更新一個表時,會自動獲得這個表的TM鎖,這樣能夠防止,另外一個在該表上執行DROP或者ALTER語句刪除該表或更改該表的結構。

DDL鎖:用來保護資料對象結構定義,DDL操作會自動為資料庫物件加DDL鎖。

注意:Oracle中,DDL語句封裝在隱式提交(復原)中來執行操作。


並發處理用Lock好還用交易處理好?(C#)

交易處理好
 
資料庫事物的並發控制的題目,順便跟我說說事物處理吧

共有六種情況,按先後提交的次序如下:
情況1:T1 T2 T3 x=3
情況2:T1 T3 T2 x=6
情況3:T2 T1 T3 x=3
情況4:T2 T3 T1 x=4
情況5:T3 T1 T2 x=8
情況6:T3 T2 T1 x=7

交易處理的一些知識點:
1.事務是一個最小的工作單元,不論成功與否都作為一個整體進行工作。
2.事務具有ACID屬性,就是:原子性(Atomicity )、一致性( Consistency )、隔離性( Isolation)和持久性(Durabilily)。
原子性屬性用於標識事務是否完全地完成,一個事務的任何更新要在系統上完全完成,如果由於某種原因出錯,事務不能完成它的全部任務,系統將返回到事務開始前的狀態。
事務在系統完整性中實施一致性,這通過保證系統的任何事務最後都處於有效狀態來實現。如果事務成功地完成,那麼系統中所有變化將正確地應用,系統處於有效狀態。如果在事務中出現錯誤,那麼系統中的所有變化將自動地復原,系統返回到原始狀態。因為事務開始時系統處於一致狀態,所以現在系統仍然處於一致狀態。
在隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。
持久性意味著一旦事務執行成功,在系統中產生的所有變化將是永久的。應該存在一些檢查點防止在系統失敗時丟失資訊。甚至硬體本身失敗,系統的狀態仍能通過在日誌中記錄事務完成的任務進行重建。持久性的概念允許開發人員認為不管系統以後發生了什麼變化,完成的事務是系統永久的部分。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.