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