oracle database about Business and Lock ------事務與鎖

事務

必須具備以下四個屬性,簡稱ACID 屬性:
原子性(Atomicity): 事務是一個完整的操作。事務的各步操作是不可分的(如原子不可分);各步操作要麼都執行了,要麼都不執行。
一致性(Consistency):1)一個事務結束之後,所有會話發起的查詢所看到的該事務的結果都是一致的(commit後的查詢有同樣的結果)。
2)一個查詢的結果必須與數據庫在查詢開始時的狀態保持一致(讀不等寫,寫不等讀)。
隔離性(Isolation): 某個會話正在進行的事務所引起的變更對於其他會話來說必須不可見。
持久性(Durability): 事務一旦提交完成後,數據庫就不可以丟失這個事務的結果,數據庫通過日誌能夠保持事務的持久性。


事務的開始和結束

事務採用隱性的方式,起始於session的第一條DML語句,

事務結束於
1. COMMIT(提交)或ROLLBACK(回滾)
2. DDL語句被執行(提交)
3. DCL語句被執行(提交)
4. 用戶退出SQLPLUS(正常退出是提交,非正常退出是回滾)
5. 服務器故障或系統崩潰(回滾)
6. shutdowm immediate(回滾)

在一個事務裏如果某個DML語句失敗,之前其他任何DML語句將保持完好,而且不會提交!

savepoint命令允許在事務進行中設置一個標記(保存點),回滾到這個標記可以保留該點之前的事務存在,並使事務繼續執行。
savepoint sp1;
rollback to sp1;

rollback to XXX 後,之前的事務不會結束。


SCN

SCN全稱是System Change Number
它是一個不斷增長的整數,相當於Oracle內部的一個時鐘,只要數據庫一有變更,這個SCN就會增加,Oracle通過SCN記錄數據庫裏事務的一致性。SCN涉及了實例恢復和介質恢復的核心概念,它幾乎無處不在:控制文件,數據文件,日誌文件都有SCN,包括block上也有SCN。

實際上,我們所說的保證同一時間點一致性讀的概念,其背後是物理層面的block讀,Oracle會依據你發出select命令,記錄下那一刻的SCN值,然後以這個SCN值去同所讀的每個block上的SCN比較,如果讀到的塊上的SCN大於select發出時記錄的SCN,則需要利用Undo得到該block的前鏡像,在內存中構造CR塊(Consistent Read)。

獲得當前SCN的兩個辦法:

SQL> select current_scn from v$database;
CURRENT_SCN
-----------
    7222678
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 7222708

有兩個函數可以實現SCN和TIMESTAMP之間的互轉
scn_to_timestamp
timestamp_to_scn

select scn_to_timestamp(current_scn) from v$database;


排他鎖,排斥其他的排他鎖和共享鎖。
共享鎖,排斥其他的排他鎖,但不排斥其他的共享鎖。

因爲有事務纔有鎖的概念。Oracle數據庫鎖可以分爲以下幾大類:

DML鎖(data locks,數據鎖),用於保護數據的完整性。
DDL鎖(dictionary locks,數據字典鎖),用於保護數據庫對象的結構,如表、索引等的結構定義。
SYSTEM鎖(internal locks and latches),保護數據庫的內部結構。

當一個用戶對某表做DML操作時,也會加DDL鎖,這樣在事務未結束前,可防止另一個用戶對該表做某些DDL操作。初始化參數ddl_lock_timeout可以設定了DDL鎖的等待時間。時間過後如果事務仍未結束,則顯示資源正忙。

當一個用戶對某表做DDL操作時,也會加DML鎖(EXCLUSIVE 排他鎖),這樣可以防止另一個用戶對該表做DML操作

Oracle的DML操作(insert、update、delete),它包括兩種鎖:TX(DML行鎖)和TM(DDL表鎖)。

TX 是面向事務的DML行鎖,它表示你鎖定了表中的一行或若干行。update和delete操作都會產生行鎖,insert操作除外。
TM 是面向對象的DDL表鎖,它表示你鎖定了系統中的一個對象,在鎖定期間不允許其他人對這個對象做DDL操作。目的就是爲了實施DDL保護。

比如一個update語句,有表級鎖(即TM)和行鎖(即TX鎖)。Oracle是先申請表級鎖TM(其中的RX鎖), 獲得後系統再自動申請行鎖(TX), 並將實際鎖定的數據行的鎖標誌置位(即指向該TX鎖)。

對於DML操作

行鎖(TX)只有一種
表鎖(TM)共有五種,分別是 RS,RX,S,SRX,X。

五種TM表鎖的含義:

  1. ROW SHARE 行共享(RS),允許其他用戶同時更新其他行,允許其他用戶同時加共享鎖,不允許有獨佔(排他性質)的鎖
  2. ROW EXCLUSIVE 行排他(RX),允許其他用戶同時更新其他行,只允許其他用戶同時加行共享鎖或者行排他鎖
  3. SHARE 共享(S),不允許其他用戶同時更新任何行,只允許其他用戶同時加共享鎖或者行共享鎖
  4. SHARE ROW EXCLUSIVE(SRX) 共享行排他,不允許其他用戶同時更新其他行,只允許其他用戶同時加行共享鎖
  5. EXCLUSIVE (X)排他,其他用戶禁止更新任何行,禁止其他用戶同時加任何排他鎖。

    這裏寫圖片描述


加鎖模式

自動加鎖

做DML操作時,如insert,update,delete,以及select….for update由oracle自動完成加鎖

session1 scott: //用for update加鎖

SQL> select * from dept1 where deptno=30 for update;

    DEPTNO DNAME          LOC
---------- -------------- -------------
      30   SALES          CHICAGO

session2 sys: //不試探,被鎖住

SQL>select * from scott.dept1 for update;

session2 sys: //試探,以防被鎖住

SQL>select * from scott.dept1 for update nowait;
SQL>select * from scott.dept1 for update wait 5;

跳過加鎖的記錄,鎖定其他記錄

SQL> select * from scott.dept1 for update skip locked;

對整個表for update 是不鎖insert語句的。
wait 5:等5秒自動退出。nowait:不等待。skip locked:跳過。都可起到防止自己被掛起的作用。

人工方式加鎖,用lock命令以顯式的方式加鎖。

lock table 表名 in exclusive mode.(一般限於後三種表鎖)

觀察鎖的動態視圖v$lock
觀察鎖的靜態視圖dba_locks

SQL>select * from v$lock;
SQL>select * from dba_locks where session_id=149;

死鎖和解鎖

可以根據以下方法準確定位要kill session的sid號和serial#號

SQL> select * from v$lock where type in ('TX','TM');

SQL> select a.sid,a.serial#,b.sql_text from v$'session a,v$sql b where a.prev_sql_id=b.sql_id and a.sid=127;

SQL> select sid,serial#,blocking_session,username,event from v$session where blocking_session_status='VALID';

select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid;
select a.username,a.sid,a.serial#,a.logon_time,
 A.SQL_ID from v$locked_object b,v$session a
 where b.session_id=a.sid order by a.logon_time; 

也可以根據v$lock視圖的block 和request確定session阻塞關係,確定無誤後再殺掉這個session

SQL>ALTER SYSTEM KILL SESSION '127,2449'; 

相關的視圖有:vsession,v process,vsql,v locked,v$sqlarea

阻塞(排隊)EM : EM–>Performance–>Additional Monitoring Links–>Blocking Sessions(或Instance Locks)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章