Oracle事务和锁
事務:
定義:事務就是一組包含一條或多條語句的邏輯單元,每個事務都是一個原子單位,在事務中的語句作為一個整體,要么一起被提交,作用在數據庫上,是數據庫數據永久被修改,要么一起被撤銷,對數據不做任何修改。主要用于保證數據一致性。
例子:
? ? ? ? ? 賬戶A提取1000元,放入賬戶B,并將該操作記錄日志。
?事務基本控制語句:
SET TRANSACTION:設置事務屬性
COMMIT:提交事務
SAVEPOINT:設置保存點
ROLLBACK:回滾事務
ROLLBACK TO SAVEPOINT:回滾至保存點
事務的類型:
?????顯式事務:就是利用命令完成,自行設置commit/rollback,來設置提交或回滾,oracle不像java,不用設置開始標識,事務會開啟;(登陸數據庫后第一次執行dml語句便是事務的開始;當上一個事務結束,第一次執行dml則開始下一個事務?)
? ? ?隱式事務:不需要自行設置commit/rollback。如
? ? ? ? ? ? ? ?a.當一個程序正常結束,如使用sql plus退出時,之前的sql都會commit;
? ? ? ? ? ? ? ?b.ddl語句自動提交
? ? ? ? ? ? ? ?c.set autocommit on/off(默認是off,則所有dml都是顯示事務,需要自行設置commin/rollback),on則每次執行dml系統都自動提交或回滾。
事務的保存點:
? ? ?類似將一個長的事務劃分為多個短事務,短事務結束后,標記一個SAVEPOINT name,下一個事務提交出問題時,可指定rollback to name來回滾到name結束處。保存點的好處是當出現問題時不需要全部回滾。
? ? ? ? ? a.事務只回滾到保存點之后的操作
? ? ? ? ? b.回滾到某保存點時,它以后的保存點將被刪除,但之前的保存點將被保留
? ? ? ? ? c.保存點之后的鎖將被釋放,但之前的會被保留。
不要過分依賴保存點,應盡量把長的事務改成較短的事務操作。
事務的ACID:原子性、一致性、分離性、持久性。
? ? 注意點:
? ? ? ? ? ***在oracle中事務的使用,事務的結束情況1.當autocommit為off(默認)時,記得自己設置commit/rollback,2.執行ddl時,自動提交,3.sql*plus正常退出時,commit,異常退出時,rollback.
? ? ? ? ? ***當前會話執行事務未提交時,其他會話看不到當前會話的修改,但當前會話可見,例如當前會話修改了一條數據,當前會話再查詢則查詢到修改后的數據
鎖:
oracle利用很低的約束提供了最大程度的并發性,當一個會話在修改某行記錄時,僅僅該行會被鎖定,其他會話可以隨時讀取,且讀取的數據還是修改之前的數據,鎖可以保證事務的分離性,防止事務交互造成數據不一致。數據庫中的鎖很多都是相同自動添加和釋放的,如提交事務,oracle也允許我們手動設置。
鎖從操作權限上分可分為寫鎖和讀鎖:
排他鎖(寫鎖/X鎖/讀寫鎖):修改數據時用,排他,即當事務T對數據A添加排他鎖,則其他事務不可再對該數據添加任何鎖,此時只允許事務T對數據A進行讀寫,其他事務應該可以讀取。
共享鎖(讀鎖/S鎖/只讀鎖):共享鎖下數據只能被讀取,不能修改。數據已經被加了共享鎖情況下,不可再加排他鎖,但可被加共享鎖。
從鎖的作用對象分:
DML鎖:數據鎖,用于保護數據。是指執行dml時使用的鎖,分為行級鎖(TX,又稱事務鎖)和表級鎖(TM)。
?????行級鎖是在修改某行記錄時對該行數據鎖定,不允許其他事務修改,屬于排他鎖;
?????表級鎖用于防止修改數據時表的結構發生變化。事務在修改數據時會先獲取表級鎖,再獲取行級鎖。所以當事務A在修改數據時,不允許任何事務修改表結構。
?????當Oracle執行DML語句時,系統自動在所要操作的表上申請TM類型鎖。當TM鎖獲得后,系統再自動申請TX類型鎖,并將實際鎖定的數據行的鎖標志位進行置位。這樣在事務加鎖前檢查TX鎖相容性時就不用再逐行檢查鎖標志,而只需檢查TM鎖模式的相容性即可,大大提高了系統的效率。TM鎖包括了RS、RX、S、SRX、X等多種模式,在數據庫中用0-6來表示。不同的SQL操作產生不同類型的TM鎖
(1)行共享 (ROW SHARE) – 屬共享鎖?,禁止排他鎖定表,
(2)行排他(ROW EXCLUSIVE) – 禁止使用排他鎖和共享鎖
(3)共享鎖(SHARE)-鎖定表,僅允許其他用戶查詢表中的行,禁止其他用戶插入、更新和刪除行,多個用戶可以同時在同一個表上應用此鎖
(5)共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖
(6)排他(EXCLUSIVE) – 限制最強的表鎖,僅允許其他用戶查詢該表的行。禁止修改和鎖定表? ? ?
?????行級鎖:?
(下面這句將給該表的所有行都加上鎖)?
select * from person for update;
如果該行記錄已經被鎖定,就不用等待,系統會直接拋錯 ora-00054?
select * from person? where id = '1'? for update nowait
如果該行記錄已經被鎖定,更新的時候等待5秒,如果這5秒內,該行記錄被解鎖,那么返回查詢結果,如果5秒內仍未解鎖,那么系統會直接拋錯 ora-00054?
select * from person for update wait 5;
另外,如果使用 select * from person? where id = '1'? for update ,當該行記錄已經被鎖定時,那么系統將一直等待該行記錄被釋放后,再加鎖。
?????表級鎖:
行共享:允許用戶進行任何操作,禁止排他鎖?
lock table person in row share mode;
行排他:允許用戶進行任何操作,禁止共享鎖和排他鎖?
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;
對于通過lock table命令主動添加的鎖定來說,如果要釋放它們,只需要發出rollback命令即可
根據鎖的類型分,共有6種
1、NULL,可以某些情況下,如分布式數據庫的查詢會產生此鎖。
2、RS,表結構共享鎖
3、RX,表結構共享鎖+被操作的記錄的排它鎖
4、S,?表結構共享鎖+所有記錄共享鎖(表結構只讀和所有行記錄只讀)
5、SRX,表結構共享鎖+所有記錄排它鎖
6、X? ?表結構排它鎖+所有記錄排它鎖,自己可以修改和查看表結構及數據,其他事務只能讀
select * from able_name for update是RX,據說老版本文檔說的是RS,以后的是RX
http://blog.chinaunix.net/uid-25909722-id-3387609.html
鎖定和解鎖:在oracle中執行dml自動為表添加TM鎖,也可用lock手動添加,使用rollback則解鎖
DDL鎖:用于保護對象的結構,數據字典,表結構等,用戶不能顯示地要求使用ddl鎖
內部閂鎖:保護數據庫的內部結果,完全由系統自行調用。
轉載于:https://blog.51cto.com/11960462/1868925
總結
以上是生活随笔為你收集整理的Oracle事务和锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bug4 导入新工程时报 Target
- 下一篇: zabbix专题:第三章 Zabbix