標籤:資料庫資料 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
650) this.width=650;" class="en-media" src="/shard/s5/res/1efca714-a472-4f4b-bed3-0e99bcb1ec58" alt="1efca714-a472-4f4b-bed3-0e99bcb1ec58" />
650) this.width=650;" class="en-media" src="/shard/s5/res/f3713e6f-a123-41e8-a707-7b7f2fd7ca11" alt="f3713e6f-a123-41e8-a707-7b7f2fd7ca11" />
鎖定和解鎖:在oracle中執行dml自動為表添加TM鎖,也可用lock手動添加,使用rollback則解鎖
DDL鎖:用於保護對象的結構,資料字典,表結構等,使用者不能顯示地要求使用ddl鎖
內部閂鎖:保護資料庫的內部結果,完全由系統自行調用。
本文出自 “11950462” 部落格,謝絕轉載!
Oracle事務和鎖