日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Oracle事务和锁

發(fā)布時(shí)間:2025/7/14 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle事务和锁 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

事務(wù):

定義:事務(wù)就是一組包含一條或多條語(yǔ)句的邏輯單元,每個(gè)事務(wù)都是一個(gè)原子單位,在事務(wù)中的語(yǔ)句作為一個(gè)整體,要么一起被提交,作用在數(shù)據(jù)庫(kù)上,是數(shù)據(jù)庫(kù)數(shù)據(jù)永久被修改,要么一起被撤銷(xiāo),對(duì)數(shù)據(jù)不做任何修改。主要用于保證數(shù)據(jù)一致性。

例子

? ? ? ? ? 賬戶A提取1000元,放入賬戶B,并將該操作記錄日志。

?事務(wù)基本控制語(yǔ)句:

SET TRANSACTION:設(shè)置事務(wù)屬性

COMMIT:提交事務(wù)

SAVEPOINT:設(shè)置保存點(diǎn)

ROLLBACK:回滾事務(wù)

ROLLBACK TO SAVEPOINT:回滾至保存點(diǎn)

事務(wù)的類型:

?????顯式事務(wù):就是利用命令完成,自行設(shè)置commit/rollback,來(lái)設(shè)置提交或回滾,oracle不像java,不用設(shè)置開(kāi)始標(biāo)識(shí),事務(wù)會(huì)開(kāi)啟;(登陸數(shù)據(jù)庫(kù)后第一次執(zhí)行dml語(yǔ)句便是事務(wù)的開(kāi)始;當(dāng)上一個(gè)事務(wù)結(jié)束,第一次執(zhí)行dml則開(kāi)始下一個(gè)事務(wù)?)

? ? ?隱式事務(wù):不需要自行設(shè)置commit/rollback。如

? ? ? ? ? ? ? ?a.當(dāng)一個(gè)程序正常結(jié)束,如使用sql plus退出時(shí),之前的sql都會(huì)commit;

? ? ? ? ? ? ? ?b.ddl語(yǔ)句自動(dòng)提交

? ? ? ? ? ? ? ?c.set autocommit on/off(默認(rèn)是off,則所有dml都是顯示事務(wù),需要自行設(shè)置commin/rollback),on則每次執(zhí)行dml系統(tǒng)都自動(dòng)提交或回滾。

事務(wù)的保存點(diǎn):

? ? ?類似將一個(gè)長(zhǎng)的事務(wù)劃分為多個(gè)短事務(wù),短事務(wù)結(jié)束后,標(biāo)記一個(gè)SAVEPOINT name,下一個(gè)事務(wù)提交出問(wèn)題時(shí),可指定rollback to name來(lái)回滾到name結(jié)束處。保存點(diǎn)的好處是當(dāng)出現(xiàn)問(wèn)題時(shí)不需要全部回滾。

? ? ? ? ? a.事務(wù)只回滾到保存點(diǎn)之后的操作

? ? ? ? ? b.回滾到某保存點(diǎn)時(shí),它以后的保存點(diǎn)將被刪除,但之前的保存點(diǎn)將被保留

? ? ? ? ? c.保存點(diǎn)之后的鎖將被釋放,但之前的會(huì)被保留。

不要過(guò)分依賴保存點(diǎn),應(yīng)盡量把長(zhǎng)的事務(wù)改成較短的事務(wù)操作。

事務(wù)的ACID:原子性、一致性、分離性、持久性。

? ? 注意點(diǎn):

? ? ? ? ? ***在oracle中事務(wù)的使用,事務(wù)的結(jié)束情況1.當(dāng)autocommit為off(默認(rèn))時(shí),記得自己設(shè)置commit/rollback,2.執(zhí)行ddl時(shí),自動(dòng)提交,3.sql*plus正常退出時(shí),commit,異常退出時(shí),rollback.

? ? ? ? ? ***當(dāng)前會(huì)話執(zhí)行事務(wù)未提交時(shí),其他會(huì)話看不到當(dāng)前會(huì)話的修改,但當(dāng)前會(huì)話可見(jiàn),例如當(dāng)前會(huì)話修改了一條數(shù)據(jù),當(dāng)前會(huì)話再查詢則查詢到修改后的數(shù)據(jù)

鎖:

oracle利用很低的約束提供了最大程度的并發(fā)性,當(dāng)一個(gè)會(huì)話在修改某行記錄時(shí),僅僅該行會(huì)被鎖定,其他會(huì)話可以隨時(shí)讀取,且讀取的數(shù)據(jù)還是修改之前的數(shù)據(jù),鎖可以保證事務(wù)的分離性,防止事務(wù)交互造成數(shù)據(jù)不一致。數(shù)據(jù)庫(kù)中的鎖很多都是相同自動(dòng)添加和釋放的,如提交事務(wù),oracle也允許我們手動(dòng)設(shè)置。

鎖從操作權(quán)限上分可分為寫(xiě)鎖和讀鎖:

排他鎖(寫(xiě)鎖/X鎖/讀寫(xiě)鎖):修改數(shù)據(jù)時(shí)用,排他,即當(dāng)事務(wù)T對(duì)數(shù)據(jù)A添加排他鎖,則其他事務(wù)不可再對(duì)該數(shù)據(jù)添加任何鎖,此時(shí)只允許事務(wù)T對(duì)數(shù)據(jù)A進(jìn)行讀寫(xiě),其他事務(wù)應(yīng)該可以讀取。

共享鎖(讀鎖/S鎖/只讀鎖):共享鎖下數(shù)據(jù)只能被讀取,不能修改。數(shù)據(jù)已經(jīng)被加了共享鎖情況下,不可再加排他鎖,但可被加共享鎖。

從鎖的作用對(duì)象分:

DML鎖:數(shù)據(jù)鎖,用于保護(hù)數(shù)據(jù)。是指執(zhí)行dml時(shí)使用的鎖,分為行級(jí)鎖(TX,又稱事務(wù)鎖)和表級(jí)鎖(TM)。

?????行級(jí)鎖是在修改某行記錄時(shí)對(duì)該行數(shù)據(jù)鎖定,不允許其他事務(wù)修改,屬于排他鎖;

?????表級(jí)鎖用于防止修改數(shù)據(jù)時(shí)表的結(jié)構(gòu)發(fā)生變化。事務(wù)在修改數(shù)據(jù)時(shí)會(huì)先獲取表級(jí)鎖,再獲取行級(jí)鎖。所以當(dāng)事務(wù)A在修改數(shù)據(jù)時(shí),不允許任何事務(wù)修改表結(jié)構(gòu)。

?????當(dāng)Oracle執(zhí)行DML語(yǔ)句時(shí),系統(tǒng)自動(dòng)在所要操作的表上申請(qǐng)TM類型鎖。當(dāng)TM鎖獲得后,系統(tǒng)再自動(dòng)申請(qǐng)TX類型鎖,并將實(shí)際鎖定的數(shù)據(jù)行的鎖標(biāo)志位進(jìn)行置位。這樣在事務(wù)加鎖前檢查T(mén)X鎖相容性時(shí)就不用再逐行檢查鎖標(biāo)志,而只需檢查T(mén)M鎖模式的相容性即可,大大提高了系統(tǒng)的效率。TM鎖包括了RS、RX、S、SRX、X等多種模式,在數(shù)據(jù)庫(kù)中用0-6來(lái)表示。不同的SQL操作產(chǎn)生不同類型的TM鎖

(1)行共享 (ROW SHARE) – 屬共享鎖?,禁止排他鎖定表,

(2)行排他(ROW EXCLUSIVE) – 禁止使用排他鎖和共享鎖

(3)共享鎖(SHARE)-鎖定表,僅允許其他用戶查詢表中的行,禁止其他用戶插入、更新和刪除行,多個(gè)用戶可以同時(shí)在同一個(gè)表上應(yīng)用此鎖

(5)共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖

(6)排他(EXCLUSIVE) – 限制最強(qiáng)的表鎖,僅允許其他用戶查詢?cè)摫淼男小=剐薷暮玩i定表? ? ?

?????行級(jí)鎖:?

(下面這句將給該表的所有行都加上鎖)?

select * from person for update;

如果該行記錄已經(jīng)被鎖定,就不用等待,系統(tǒng)會(huì)直接拋錯(cuò) ora-00054?

select * from person? where id = '1'? for update nowait

如果該行記錄已經(jīng)被鎖定,更新的時(shí)候等待5秒,如果這5秒內(nèi),該行記錄被解鎖,那么返回查詢結(jié)果,如果5秒內(nèi)仍未解鎖,那么系統(tǒng)會(huì)直接拋錯(cuò) ora-00054?

select * from person for update wait 5;

另外,如果使用 select * from person? where id = '1'? for update ,當(dāng)該行記錄已經(jīng)被鎖定時(shí),那么系統(tǒng)將一直等待該行記錄被釋放后,再加鎖。

?????表級(jí)鎖:

行共享:允許用戶進(jìn)行任何操作,禁止排他鎖?

lock table person in row share mode;

行排他:允許用戶進(jìn)行任何操作,禁止共享鎖和排他鎖?

lock table person in row exclusive mode;

共享鎖:其他用戶只能看,不能修改?

lock table person in share mode;

共享行排他:比共享鎖有更多限制?

lock table person in share row exclusive mode;

排他鎖:其他用戶只能看,不能修改,不能加其他鎖?

lock table person in exclusive mode;

對(duì)于通過(guò)lock table命令主動(dòng)添加的鎖定來(lái)說(shuō),如果要釋放它們,只需要發(fā)出rollback命令即可

根據(jù)鎖的類型分,共有6種

1、NULL,可以某些情況下,如分布式數(shù)據(jù)庫(kù)的查詢會(huì)產(chǎn)生此鎖。

2、RS,表結(jié)構(gòu)共享鎖

3、RX,表結(jié)構(gòu)共享鎖+被操作的記錄的排它鎖

4、S,?表結(jié)構(gòu)共享鎖+所有記錄共享鎖(表結(jié)構(gòu)只讀和所有行記錄只讀)

5、SRX,表結(jié)構(gòu)共享鎖+所有記錄排它鎖

6、X? ?表結(jié)構(gòu)排它鎖+所有記錄排它鎖,自己可以修改和查看表結(jié)構(gòu)及數(shù)據(jù),其他事務(wù)只能讀

select * from able_name for update是RX,據(jù)說(shuō)老版本文檔說(shuō)的是RS,以后的是RX

http://blog.chinaunix.net/uid-25909722-id-3387609.html

鎖定和解鎖:在oracle中執(zhí)行dml自動(dòng)為表添加TM鎖,也可用lock手動(dòng)添加,使用rollback則解鎖

DDL鎖:用于保護(hù)對(duì)象的結(jié)構(gòu),數(shù)據(jù)字典,表結(jié)構(gòu)等,用戶不能顯示地要求使用ddl鎖

內(nèi)部閂鎖:保護(hù)數(shù)據(jù)庫(kù)的內(nèi)部結(jié)果,完全由系統(tǒng)自行調(diào)用。


轉(zhuǎn)載于:https://blog.51cto.com/11960462/1868925

總結(jié)

以上是生活随笔為你收集整理的Oracle事务和锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。