Oracle數據庫—— 事務處理與並發控制


一、涉及內容

  1.理解事務的概念和幾個特性。

  2.熟練掌握事務管理命令的使用。

  3.理解並發操作的概念和數據庫鎖的類型。

二、具體操作

(12.5 實驗)

  1. 分析以下代碼,說出代碼中的哪些部分體現了事務的語句級原子性、過程級原子性和事務級原子性。

create table book
(bid number(4) CONSTRAINT pk_bid PRIMARY KEY DEFERRABLE INITIALLY IMMEDIATE,
 bname varchar2(30),
 bprice number(4,1));

insert into book values(1001,'Oracle 10g 數據庫開發',35.4);
insert into book values(1001,'Java 程序設計',40);

begin
insert into book values(1002,'Java 程序設計',40);
insert into book values(1002,'計算機英語',28);
end;

insert into book values(1003,'計算機英語',28);
commit;

答:

(1)體現語句級原子性:上述代碼中的每一條語句均能體現語句級原子性。每條語句本身也是最小級別的事務,該語句要么完全執行成功,要么完全失敗,並且它不會影響其他語句的執行。

(2)體現過程級原子性:

以下這個匿名塊:

begin

insert into book values(1002,'Java 程序設計',40);

insert into book values(1002,'計算機英語',28);

end;

這里PL/SQL匿名過程塊也當作是語句,當作一個整體,過程中的所有代碼要么都執行成功,要么都執行失敗,並且不影響過程外的其他語句。

(3)體現事務級原子性:

上述代碼中的所有語句及匿名塊,即整個事務中的所有語句和匿名塊都當作一個整體,一個事務。用戶在提交或回滾事務時,要么所有語句都執行,要么都失敗。

事務級原子性中包含了語句級原子性和過程級原子性,整個事務中的語句或匿名塊首先受語句級原子性和過程級原子性的影響。

2. 數據庫的DDL命令作為一個獨立的事務執行,若以下代碼在Sql*Plus的窗口1執行,那么在Sqlplus的窗口2中能夠看到哪些新數據?

insert into scott.emp(empno,sal)  values(1001,3000);
insert into scott.emp(empno,sal)  values(1002,3000);
create table t1(id number);
insert into scott.emp(empno,sal)  values(1003,3000);

  在Sql*Plus的窗口1執行上述代碼:

 

在Sqlplus的窗口2中查看scott.emp(empno,sal):

 

如上圖所示,在Sqlplus的窗口2只能查看到在Sqlplus的窗口1中執行代碼的create 之前的插入的數據。

3. 使用ROLLBACK可以將事務回滾到某個保存點,分析以下代碼執行的結果。

insert into scott.emp(empno)  values(1011);
SAVEPOINT aa;
insert into scott.emp(empno)  values(1012);
ROLLBACK to aa;
insert into scott.emp(empno)  values(1013);
commit;

  答:執行結果截圖如下:

   

 

因為使用了ROLLBACK,可將事務回滾到某個保存點。故上述代碼執行完后只能看到插入的1011和1013兩條記錄的數據。

4. 利用第一題中創建的book表,分析以下兩段代碼的執行結果有何不同?

代碼段一:

insert into book values(1011,null,null);
insert into book values(1011,null,null);
commit;

執行結果截圖:

 

代碼段二:

set CONSTRAINT pk_bid deferred;
insert into book values(1011,null,null);
insert into book values(1011,null,null);
commit;

執行結果截圖:

 

答:代碼段一中插入兩條一樣的記錄,違反主鍵約束,插入重復的記錄失敗。代碼段二中,設置了約束延遲生效,插入重復的記錄暫時成功,但是當提交事務時檢查約束,違反了主鍵約束,整個事務被回滾,兩條看似成功的insert命令都失敗了。

 

5.按照以下要求書寫代碼並執行,根據實驗結果說明事務在不同隔離級別下的特點。

 打開3個Sqlplus窗口,在窗口1中向scott.emp表中插入一行新數據,在窗口2中設置事務的隔離屬性是READ ONLY,在窗口3中設置事務的隔離屬性是READ WRITE。在窗口1提交插入命令的前后,觀察窗口2和窗口3 中能否看到這條新數據。嘗試在窗口2和窗口3中分別向scott.emp表中插入新數據,看看能否成功。

(1)在窗口1中向scott.emp表中插入一行新數據:

 

(2)在窗口2中設置事務的隔離屬性是READ ONLY;

 

(3)在窗口3中設置事務的隔離屬性是READ WRITE;

 

(4)窗口1提交前,觀察窗口2和窗口3 中均不能看到這條新數據;

   

(5)窗口1提交后,觀察窗口2還是不能看到;而窗口3 中可以看到這條新數據;

  

 

(6)在窗口2向scott.emp表中插入新數據,不能成功。

 

(7)在窗口3中向scott.emp表中插入新數據,可以插入成功。

 

 

(12.6 習題)

(一)填空題

1.事務的ACID特性包括(原子性)、(一致性)、(隔離性)、(持久性)。

2.在設置事務隔離層時,需要使用關鍵字(SET TRANSACTION)。

3.在眾多的事務控制語句中,用來撤銷事務操作的語句是(ROLLBACK),用來持久化事務對數據庫操作的語句是(COMMIT)。

4.對表執行INSERT命令時系統自動加(RX)鎖,執行CREATE命令時系統自動加(S)鎖,執行ALTER命令時系統自動加(X)鎖。

(二)簡答題

1.哪些情況發生后事務將終止?

答:Oracle中的事務終止會發生在:

(1)用戶使用COMMIT命令顯示提交事務。

(2)用戶使用ROLLBACK命令回滾整個事務。

(3)用戶執行了一條DDL語句。(如create\drop\alter)

(4) 用戶正常斷開了與Oracle的連接,這時用戶當前的事務將被自動提交。

(5)用戶進程意外被終止,這時用戶當前的事務被回滾。

(6)用戶關閉SQL*PLUS會話時,默認使用ROLLBACK回滾事務。

2.數據庫的並發操作會帶來哪些問題?

答:數據庫的並發操作會帶來以下問題:
(1)丟失更新。

(2)錯讀(臟讀)。

(3)不一致的分析(不可重復讀)。

(4)幻讀。

3.要建立一個名為savepint1的保存點,應使用哪個語句?

答:應使用語句:SAVEPOINT savepint1;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM