oracle的鎖并沒有鎖升級,也就是無論有多少行數(shù)據(jù)被鎖定也不會升級到表鎖,這和sqlserver完全不一樣
oracle鎖類型包括:DML鎖、DDL鎖、內(nèi)部鎖和閂
DML鎖:數(shù)據(jù)庫操作語言鎖,比如insert、delete、update語句引發(fā)的鎖。當(dāng)進(jìn)行上述操作時,會出現(xiàn)兩種DML鎖:
TX鎖:事務(wù)鎖,當(dāng)事務(wù)發(fā)起第一次修改時會出現(xiàn)TX鎖,直到事務(wù)的提交或回滾時釋放鎖,當(dāng)執(zhí)行select for update的時候也會引發(fā);
TM鎖:當(dāng)數(shù)據(jù)被修改時,為防止出現(xiàn)表結(jié)構(gòu)的變化,比如alter、drop操作,所加的鎖,這時如果有其他事務(wù)修改表結(jié)構(gòu),會返回錯誤信息ORA-00054。
TX鎖:當(dāng)修改表中某一行或者某十行數(shù)據(jù)時,會在包含該數(shù)據(jù)的塊中記錄當(dāng)前事務(wù)的id。此時如果另會話2進(jìn)入,要修改當(dāng)前記錄時,會檢查當(dāng)前塊中的事務(wù)id,然后到事務(wù)表中查看該事務(wù)是否活動,如果不活動,那么會話2會修改該行并鎖定該行;如果活動那么會話2會發(fā)出一個request,要求會話1釋放鎖的時候通知會話2一聲。
這里涉及到了3個表:V$TRANSACTION(事務(wù)表),V$SESSION(會話表)、V$LOCK(鎖信息)
這里記錄一下V$LOCK表,這里面的記錄是針對表和會話的,而不是針對行的,如果表有1條記錄被鎖定,那么V$LOCK中會有一條記錄,如果表中有10條記錄被鎖定,那么V$LOCK中還是一條,因為它是針對于會話的。
在表V$LOCK的SID就是會話id,而通過id1和id2可以匹配到V$TRANSACTION中的事務(wù)id
舉個例子:如果事務(wù)1鎖定了一個表的10行記錄,那么V$LOCK中會有一條記錄,其中LMODE為6,表示排他鎖,REQUEST為0,表示事務(wù)1并沒有發(fā)出請求,也就是說事務(wù)1可以擁有這個鎖;
此時事務(wù)2也要鎖定這10行記錄中的若干行,結(jié)果發(fā)現(xiàn)該行已經(jīng)被事務(wù)1鎖住了,事務(wù)2只能向事務(wù)1發(fā)出請求REQUEST=6,意思是事務(wù)2向事務(wù)1發(fā)出一個排他鎖的請求,此時在V$LOCK表中有三條記錄,一條是事務(wù)2的排他鎖,一條是事務(wù)2向事務(wù)1發(fā)出的request請求,一條是事務(wù)1的排他鎖。當(dāng)事務(wù)1提交或者回滾釋放鎖后,V$LOCK中事務(wù)2的那個請求行消失,事務(wù)2獲取了該行的排他鎖。
DDL鎖:數(shù)據(jù)庫定義語言鎖,當(dāng)進(jìn)行表的alter等操作時,會觸發(fā)該鎖,防止其他會話(session)獲取到這個表的DDL鎖或者DML鎖中的TM鎖。
DDL語句是總是提交的,比如有3個alter語句,那么每個都是自動提交的,比如第二個出現(xiàn)錯誤,那么第一個也已經(jīng)提交了,無法回滾了
關(guān)于oracle的事務(wù)處理
ACID是下面的4個詞:
原子性:事務(wù)中的所有動作要么都發(fā)生,要么都不發(fā)生
一致性:事務(wù)將數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換為另一種狀態(tài)
隔離性:一個事務(wù)的影響在該事務(wù)提交前,對其他事務(wù)是不可見的
持久性:事務(wù)一旦提交,其影響的結(jié)果是永久的
分布式事務(wù):
oracle使用了一個協(xié)議,叫2pc協(xié)議(兩階段提交two-phase commit),如果同時修改多個數(shù)據(jù)庫,那么其中一個數(shù)據(jù)庫(比如數(shù)據(jù)庫1)會成為事務(wù)的發(fā)起者和協(xié)調(diào)者,具體操作如下:
1 數(shù)據(jù)庫1會詢問其他所有數(shù)據(jù)庫的事務(wù)是否已經(jīng)準(zhǔn)備完畢了
2 數(shù)據(jù)庫2和數(shù)據(jù)庫3分別報告說已經(jīng)ok了
3 數(shù)據(jù)庫1會廣播一條信息,讓所有數(shù)據(jù)庫都知道其他數(shù)據(jù)庫的事務(wù)已經(jīng)ok了,可以提交自己的事務(wù)了
如果有一個數(shù)據(jù)庫報告的是no,那么事務(wù)1會發(fā)出消息,讓所有事務(wù)回滾
如果在數(shù)據(jù)庫2和3都返回ok的時候,數(shù)據(jù)庫1馬上要廣播給其他數(shù)據(jù)庫,結(jié)果發(fā)生掉電等問題了,那么數(shù)據(jù)庫2和數(shù)據(jù)庫3的事務(wù)都會掛起等待事務(wù)1的消息,此時就會出現(xiàn)可疑事務(wù),這種事務(wù)就需要人工處理了。
oracle鎖類型包括:DML鎖、DDL鎖、內(nèi)部鎖和閂
DML鎖:數(shù)據(jù)庫操作語言鎖,比如insert、delete、update語句引發(fā)的鎖。當(dāng)進(jìn)行上述操作時,會出現(xiàn)兩種DML鎖:
TX鎖:事務(wù)鎖,當(dāng)事務(wù)發(fā)起第一次修改時會出現(xiàn)TX鎖,直到事務(wù)的提交或回滾時釋放鎖,當(dāng)執(zhí)行select for update的時候也會引發(fā);
TM鎖:當(dāng)數(shù)據(jù)被修改時,為防止出現(xiàn)表結(jié)構(gòu)的變化,比如alter、drop操作,所加的鎖,這時如果有其他事務(wù)修改表結(jié)構(gòu),會返回錯誤信息ORA-00054。
TX鎖:當(dāng)修改表中某一行或者某十行數(shù)據(jù)時,會在包含該數(shù)據(jù)的塊中記錄當(dāng)前事務(wù)的id。此時如果另會話2進(jìn)入,要修改當(dāng)前記錄時,會檢查當(dāng)前塊中的事務(wù)id,然后到事務(wù)表中查看該事務(wù)是否活動,如果不活動,那么會話2會修改該行并鎖定該行;如果活動那么會話2會發(fā)出一個request,要求會話1釋放鎖的時候通知會話2一聲。
這里涉及到了3個表:V$TRANSACTION(事務(wù)表),V$SESSION(會話表)、V$LOCK(鎖信息)
這里記錄一下V$LOCK表,這里面的記錄是針對表和會話的,而不是針對行的,如果表有1條記錄被鎖定,那么V$LOCK中會有一條記錄,如果表中有10條記錄被鎖定,那么V$LOCK中還是一條,因為它是針對于會話的。
在表V$LOCK的SID就是會話id,而通過id1和id2可以匹配到V$TRANSACTION中的事務(wù)id
舉個例子:如果事務(wù)1鎖定了一個表的10行記錄,那么V$LOCK中會有一條記錄,其中LMODE為6,表示排他鎖,REQUEST為0,表示事務(wù)1并沒有發(fā)出請求,也就是說事務(wù)1可以擁有這個鎖;
此時事務(wù)2也要鎖定這10行記錄中的若干行,結(jié)果發(fā)現(xiàn)該行已經(jīng)被事務(wù)1鎖住了,事務(wù)2只能向事務(wù)1發(fā)出請求REQUEST=6,意思是事務(wù)2向事務(wù)1發(fā)出一個排他鎖的請求,此時在V$LOCK表中有三條記錄,一條是事務(wù)2的排他鎖,一條是事務(wù)2向事務(wù)1發(fā)出的request請求,一條是事務(wù)1的排他鎖。當(dāng)事務(wù)1提交或者回滾釋放鎖后,V$LOCK中事務(wù)2的那個請求行消失,事務(wù)2獲取了該行的排他鎖。
DDL鎖:數(shù)據(jù)庫定義語言鎖,當(dāng)進(jìn)行表的alter等操作時,會觸發(fā)該鎖,防止其他會話(session)獲取到這個表的DDL鎖或者DML鎖中的TM鎖。
DDL語句是總是提交的,比如有3個alter語句,那么每個都是自動提交的,比如第二個出現(xiàn)錯誤,那么第一個也已經(jīng)提交了,無法回滾了
關(guān)于oracle的事務(wù)處理
ACID是下面的4個詞:
原子性:事務(wù)中的所有動作要么都發(fā)生,要么都不發(fā)生
一致性:事務(wù)將數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換為另一種狀態(tài)
隔離性:一個事務(wù)的影響在該事務(wù)提交前,對其他事務(wù)是不可見的
持久性:事務(wù)一旦提交,其影響的結(jié)果是永久的
分布式事務(wù):
oracle使用了一個協(xié)議,叫2pc協(xié)議(兩階段提交two-phase commit),如果同時修改多個數(shù)據(jù)庫,那么其中一個數(shù)據(jù)庫(比如數(shù)據(jù)庫1)會成為事務(wù)的發(fā)起者和協(xié)調(diào)者,具體操作如下:
1 數(shù)據(jù)庫1會詢問其他所有數(shù)據(jù)庫的事務(wù)是否已經(jīng)準(zhǔn)備完畢了
2 數(shù)據(jù)庫2和數(shù)據(jù)庫3分別報告說已經(jīng)ok了
3 數(shù)據(jù)庫1會廣播一條信息,讓所有數(shù)據(jù)庫都知道其他數(shù)據(jù)庫的事務(wù)已經(jīng)ok了,可以提交自己的事務(wù)了
如果有一個數(shù)據(jù)庫報告的是no,那么事務(wù)1會發(fā)出消息,讓所有事務(wù)回滾
如果在數(shù)據(jù)庫2和3都返回ok的時候,數(shù)據(jù)庫1馬上要廣播給其他數(shù)據(jù)庫,結(jié)果發(fā)生掉電等問題了,那么數(shù)據(jù)庫2和數(shù)據(jù)庫3的事務(wù)都會掛起等待事務(wù)1的消息,此時就會出現(xiàn)可疑事務(wù),這種事務(wù)就需要人工處理了。