Oracle数据库—— 事务处理与并发控制
一、涉及內(nèi)容
1.理解事務(wù)的概念和幾個(gè)特性。
2.熟練掌握事務(wù)管理命令的使用。
3.理解并發(fā)操作的概念和數(shù)據(jù)庫(kù)鎖的類(lèi)型。
二、具體操作
(12.5 實(shí)驗(yàn))
? 1. 分析以下代碼,說(shuō)出代碼中的哪些部分體現(xiàn)了事務(wù)的語(yǔ)句級(jí)原子性、過(guò)程級(jí)原子性和事務(wù)級(jí)原子性。
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 數(shù)據(jù)庫(kù)開(kāi)發(fā)',35.4); insert into book values(1001,'Java 程序設(shè)計(jì)',40);begin insert into book values(1002,'Java 程序設(shè)計(jì)',40); insert into book values(1002,'計(jì)算機(jī)英語(yǔ)',28); end;insert into book values(1003,'計(jì)算機(jī)英語(yǔ)',28); commit;答:
(1)體現(xiàn)語(yǔ)句級(jí)原子性:上述代碼中的每一條語(yǔ)句均能體現(xiàn)語(yǔ)句級(jí)原子性。每條語(yǔ)句本身也是最小級(jí)別的事務(wù),該語(yǔ)句要么完全執(zhí)行成功,要么完全失敗,并且它不會(huì)影響其他語(yǔ)句的執(zhí)行。
(2)體現(xiàn)過(guò)程級(jí)原子性:
以下這個(gè)匿名塊:
begin
insert into book values(1002,'Java 程序設(shè)計(jì)',40);
insert into book values(1002,'計(jì)算機(jī)英語(yǔ)',28);
end;
這里PL/SQL匿名過(guò)程塊也當(dāng)作是語(yǔ)句,當(dāng)作一個(gè)整體,過(guò)程中的所有代碼要么都執(zhí)行成功,要么都執(zhí)行失敗,并且不影響過(guò)程外的其他語(yǔ)句。
(3)體現(xiàn)事務(wù)級(jí)原子性:
上述代碼中的所有語(yǔ)句及匿名塊,即整個(gè)事務(wù)中的所有語(yǔ)句和匿名塊都當(dāng)作一個(gè)整體,一個(gè)事務(wù)。用戶(hù)在提交或回滾事務(wù)時(shí),要么所有語(yǔ)句都執(zhí)行,要么都失敗。
事務(wù)級(jí)原子性中包含了語(yǔ)句級(jí)原子性和過(guò)程級(jí)原子性,整個(gè)事務(wù)中的語(yǔ)句或匿名塊首先受語(yǔ)句級(jí)原子性和過(guò)程級(jí)原子性的影響。
2. 數(shù)據(jù)庫(kù)的DDL命令作為一個(gè)獨(dú)立的事務(wù)執(zhí)行,若以下代碼在Sql*Plus的窗口1執(zhí)行,那么在Sqlplus的窗口2中能夠看到哪些新數(shù)據(jù)?
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執(zhí)行上述代碼:
?
在Sqlplus的窗口2中查看scott.emp(empno,sal):
?
如上圖所示,在Sqlplus的窗口2只能查看到在Sqlplus的窗口1中執(zhí)行代碼的create 之前的插入的數(shù)據(jù)。
3. 使用ROLLBACK可以將事務(wù)回滾到某個(gè)保存點(diǎn),分析以下代碼執(zhí)行的結(jié)果。
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;? 答:執(zhí)行結(jié)果截圖如下:
???
?
因?yàn)槭褂昧薘OLLBACK,可將事務(wù)回滾到某個(gè)保存點(diǎn)。故上述代碼執(zhí)行完后只能看到插入的1011和1013兩條記錄的數(shù)據(jù)。
4. 利用第一題中創(chuàng)建的book表,分析以下兩段代碼的執(zhí)行結(jié)果有何不同?
代碼段一:
insert into book values(1011,null,null); insert into book values(1011,null,null); commit;執(zhí)行結(jié)果截圖:
?
代碼段二:
set CONSTRAINT pk_bid deferred; insert into book values(1011,null,null); insert into book values(1011,null,null); commit;執(zhí)行結(jié)果截圖:
?
答:代碼段一中插入兩條一樣的記錄,違反主鍵約束,插入重復(fù)的記錄失敗。代碼段二中,設(shè)置了約束延遲生效,插入重復(fù)的記錄暫時(shí)成功,但是當(dāng)提交事務(wù)時(shí)檢查約束,違反了主鍵約束,整個(gè)事務(wù)被回滾,兩條看似成功的insert命令都失敗了。
?
5.按照以下要求書(shū)寫(xiě)代碼并執(zhí)行,根據(jù)實(shí)驗(yàn)結(jié)果說(shuō)明事務(wù)在不同隔離級(jí)別下的特點(diǎn)。
?打開(kāi)3個(gè)Sqlplus窗口,在窗口1中向scott.emp表中插入一行新數(shù)據(jù),在窗口2中設(shè)置事務(wù)的隔離屬性是READ ONLY,在窗口3中設(shè)置事務(wù)的隔離屬性是READ WRITE。在窗口1提交插入命令的前后,觀察窗口2和窗口3 中能否看到這條新數(shù)據(jù)。嘗試在窗口2和窗口3中分別向scott.emp表中插入新數(shù)據(jù),看看能否成功。
(1)在窗口1中向scott.emp表中插入一行新數(shù)據(jù):
?
(2)在窗口2中設(shè)置事務(wù)的隔離屬性是READ ONLY;
?
(3)在窗口3中設(shè)置事務(wù)的隔離屬性是READ WRITE;
?
(4)窗口1提交前,觀察窗口2和窗口3 中均不能看到這條新數(shù)據(jù);
???
(5)窗口1提交后,觀察窗口2還是不能看到;而窗口3 中可以看到這條新數(shù)據(jù);
??
?
(6)在窗口2向scott.emp表中插入新數(shù)據(jù),不能成功。
?
(7)在窗口3中向scott.emp表中插入新數(shù)據(jù),可以插入成功。
?
?
(12.6 習(xí)題)
(一)填空題
1.事務(wù)的ACID特性包括(原子性)、(一致性)、(隔離性)、(持久性)。
2.在設(shè)置事務(wù)隔離層時(shí),需要使用關(guān)鍵字(SET TRANSACTION)。
3.在眾多的事務(wù)控制語(yǔ)句中,用來(lái)撤銷(xiāo)事務(wù)操作的語(yǔ)句是(ROLLBACK),用來(lái)持久化事務(wù)對(duì)數(shù)據(jù)庫(kù)操作的語(yǔ)句是(COMMIT)。
4.對(duì)表執(zhí)行INSERT命令時(shí)系統(tǒng)自動(dòng)加(RX)鎖,執(zhí)行CREATE命令時(shí)系統(tǒng)自動(dòng)加(S)鎖,執(zhí)行ALTER命令時(shí)系統(tǒng)自動(dòng)加(X)鎖。
(二)簡(jiǎn)答題
1.哪些情況發(fā)生后事務(wù)將終止?
答:Oracle中的事務(wù)終止會(huì)發(fā)生在:
(1)用戶(hù)使用COMMIT命令顯示提交事務(wù)。
(2)用戶(hù)使用ROLLBACK命令回滾整個(gè)事務(wù)。
(3)用戶(hù)執(zhí)行了一條DDL語(yǔ)句。(如create\drop\alter)
(4) 用戶(hù)正常斷開(kāi)了與Oracle的連接,這時(shí)用戶(hù)當(dāng)前的事務(wù)將被自動(dòng)提交。
(5)用戶(hù)進(jìn)程意外被終止,這時(shí)用戶(hù)當(dāng)前的事務(wù)被回滾。
(6)用戶(hù)關(guān)閉SQL*PLUS會(huì)話(huà)時(shí),默認(rèn)使用ROLLBACK回滾事務(wù)。
2.數(shù)據(jù)庫(kù)的并發(fā)操作會(huì)帶來(lái)哪些問(wèn)題?
答:數(shù)據(jù)庫(kù)的并發(fā)操作會(huì)帶來(lái)以下問(wèn)題:
(1)丟失更新。
(2)錯(cuò)讀(臟讀)。
(3)不一致的分析(不可重復(fù)讀)。
(4)幻讀。
3.要建立一個(gè)名為savepint1的保存點(diǎn),應(yīng)使用哪個(gè)語(yǔ)句?
答:應(yīng)使用語(yǔ)句:SAVEPOINT savepint1;
來(lái)源:https://www.cnblogs.com/shenxiaolin/p/5549343.html
轉(zhuǎn)載于:https://www.cnblogs.com/CaptainFM/p/10689988.html
總結(jié)
以上是生活随笔為你收集整理的Oracle数据库—— 事务处理与并发控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NameNode与DataNode的工作
- 下一篇: Java开发,月薪30k需要掌握哪些主流