Oracle事務(wù)與鎖 知識(shí)點(diǎn)摘記
事務(wù):事務(wù)用于保證數(shù)據(jù)的一致性,它由一組相關(guān)的dml語句組成,該組的dml語句要么全部成功要么全部失敗。
說明:一組SQL,一個(gè)邏輯工作單位,執(zhí)行整體修改或者整體回退。
事務(wù)的相關(guān)概念:
1、事務(wù)的提交和回滾:COMMIT/ROOLLBACK
2、事務(wù)的開始和結(jié)束:
開始事務(wù):連接到數(shù)據(jù)庫,執(zhí)行DML,DCL,DDL語句
結(jié)束事務(wù): 1)執(zhí)行DDL(例如CREATE TABLE),DCL(例如GRANT),系統(tǒng)自動(dòng)執(zhí)行COMMIT語句
2)執(zhí)行COMMIT/ROLLBACK
3)退出/斷開數(shù)據(jù)庫的連接自動(dòng)執(zhí)行COMMIT語句
4)進(jìn)程意外終止,事務(wù)自動(dòng)rollback
5)事務(wù)COMMIT時(shí)會(huì)生成一個(gè)唯一的系統(tǒng)變化號(hào)(SCN)來保存到事務(wù)表
保存點(diǎn)(savepoint): 可以在事務(wù)的任意位置設(shè)置保存點(diǎn),以便于ROLLBACK
事務(wù)的四個(gè)特性ACID:
1)Atomicity(原子性):事務(wù)中sql語句不可分割,要么全部做,要么全部不做
2)Consistency(一致性):指事務(wù)操作前后數(shù)據(jù)庫中的數(shù)據(jù)是一致的,數(shù)據(jù)滿足業(yè)務(wù)規(guī)則約束(例如賬戶金額的轉(zhuǎn)出和轉(zhuǎn)入),與原子性對(duì)應(yīng)
3)Isolation(隔離性):多個(gè)并發(fā)事務(wù)可以獨(dú)立運(yùn)行,而不能相互干擾,一個(gè)事務(wù)修改數(shù)據(jù)未提交前,其他事務(wù)不能看到它所進(jìn)行的修改
4)Durability(持久性):事務(wù)提交后,數(shù)據(jù)的修改是永久的
死鎖:當(dāng)兩個(gè)事務(wù)相互等待對(duì)方釋放資源時(shí)候就會(huì)形成死鎖
兩個(gè)并發(fā)事務(wù)同時(shí)訪問數(shù)據(jù)庫表相同的行時(shí),可能存在以下三個(gè)問題:
1、幻想讀:事務(wù)T1讀取一條指定where條件的語句,返回結(jié)果集。此時(shí)事務(wù)T2插入一行新記錄,恰好滿足T1的where條件。然后T1使用相同的條件再次查詢,結(jié)果集中可以看到T2插入的記錄,這條新紀(jì)錄就是幻想。
2、不可重復(fù)讀取:事務(wù)T1讀取一行記錄,緊接著事務(wù)T2修改了T1剛剛讀取的記錄,然后T1再次查詢,發(fā)現(xiàn)與第一次讀取的記錄不同,這稱為不可重復(fù)讀。
3、臟讀:事務(wù)T1更新了一行記錄,還未提交所做的修改,這個(gè)T2讀取了更新后的數(shù)據(jù),然后T1執(zhí)行回滾操作,取消剛才的修改,所以T2所讀取的行就無效,也就是臟數(shù)據(jù)。
為了處理這些問題,SQL標(biāo)準(zhǔn)定義了以下幾種事務(wù)隔離級(jí)別
READ UNCOMMITTED 幻想讀、不可重復(fù)讀和臟讀都允許。
READ COMMITTED 允許幻想讀、不可重復(fù)讀,不允許臟讀
REPEATABLE READ 允許幻想讀,不允許不可重復(fù)讀和臟讀
SERIALIZABLE 幻想讀、不可重復(fù)讀和臟讀都不允許
事務(wù)和鎖:
當(dāng)執(zhí)行事務(wù)操作時(shí)(dml語句),Oracle會(huì)在被作用的表上加鎖,防止其他用戶修改表的結(jié)構(gòu),這對(duì)我們用戶來說是非常重要的
所謂死鎖:是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因?yàn)闋帄Z資源而造成的相互等待現(xiàn)象,若無外力作用,這些進(jìn)程都將無法進(jìn)行下去
此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在相等待的進(jìn)程稱為死鎖進(jìn)程
由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源呢后,使得有關(guān)進(jìn)程在無外力協(xié)助的情況下,永遠(yuǎn)分配不到資源而無法繼續(xù)運(yùn)行下去,就產(chǎn)生了這一特殊的死鎖現(xiàn)象
數(shù)據(jù)庫死鎖的現(xiàn)象:程序執(zhí)行的過程中,點(diǎn)擊確定或者保存按鈕,程序沒有響應(yīng),也沒提示錯(cuò)誤
死鎖的原理: 對(duì)于數(shù)據(jù)庫某個(gè)表的某一列做更新或者刪除操作,執(zhí)行完畢后該條語句不提交,另一條對(duì)于這一列數(shù)據(jù)做更新操作的語句在執(zhí)行的時(shí)候就會(huì)進(jìn)入等待狀態(tài),此時(shí)的現(xiàn)象就是這條語句一直在執(zhí)行但是一直不能執(zhí)行成功,也不會(huì)報(bào)錯(cuò)
解決方法: 將產(chǎn)生死鎖的語句提交即可,但是在執(zhí)行的過程中,用戶可能不知道產(chǎn)生死鎖的語句是哪一句,可以將程序關(guān)閉并重新啟動(dòng)即可
鎖包括行級(jí)鎖、表級(jí)鎖、悲觀鎖、樂觀鎖
行級(jí)鎖:一種它鎖,防止另外事務(wù)修改此行;在使用以下語句時(shí),Oracle會(huì)自動(dòng)應(yīng)用行級(jí)鎖:INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];SELECT … FOR UPDATE語句允許用戶一次鎖定多條記錄進(jìn)行更新.使用commit或者rollback釋放鎖。 特點(diǎn):開鎖大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。適合于有大量按索引更新少量不同數(shù)據(jù),同時(shí)又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理系統(tǒng)。
表級(jí)鎖:5種
共享鎖(SHARE) - 鎖定表,對(duì)記錄只讀不寫,多個(gè)用戶可以同時(shí)在同一個(gè)表上應(yīng)用此鎖,在表沒有被任何DML操作時(shí),多個(gè)事務(wù)都可加鎖,但只有在僅一個(gè)事務(wù)加鎖的情況下只有此事務(wù)才能對(duì)表更新;當(dāng)表已經(jīng)被更新或者指定要更新時(shí)(select for update),任何事務(wù)都不能加此鎖了。
共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖,在表沒有被任何DML操作時(shí),只有一個(gè)事務(wù)可以加鎖,可以更新,書上說別的事務(wù)可以使用select for update鎖定選中的數(shù)據(jù)行,可是實(shí)驗(yàn)后沒被驗(yàn)證。
排他(EXCLUSIVE) – 限制最強(qiáng)的表鎖,僅允許其他用戶查詢?cè)摫淼男小=剐薷暮玩i定表
行共享 (ROW SHARE) – 禁止排他鎖定表,與行排他類似,區(qū)別是別的事務(wù)還可以在此表上加任何排他鎖。(除排他(exclusive)外)
行排他(ROW EXCLUSIVE) – 禁止使用排他鎖和共享鎖,其他事務(wù)依然可以并發(fā)地對(duì)相同數(shù)據(jù)表執(zhí)行查詢,插入,更新,刪除操作,或?qū)Ρ韮?nèi)數(shù)據(jù)行加鎖的操作,但不能有其他的排他鎖(自身是可以的,沒發(fā)現(xiàn)有什么用)
悲觀鎖:Pessimistic Lock正如其名,它指的是對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守悲觀態(tài)度,事務(wù)每次去操作數(shù)據(jù)的時(shí)候都假設(shè)有其他事務(wù)會(huì)修改需要訪問的數(shù)據(jù),所以在訪問之前都要求上鎖,行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖,因此,在整個(gè)數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。
一個(gè)典型的倚賴數(shù)據(jù)庫的悲觀鎖調(diào)用: select * from account where name=”Erica” for update 這條sql 語句鎖定了account 表中所有符合檢索條件(name=”Erica”)的記錄。 本次事務(wù)提交之前(事務(wù)提交時(shí)會(huì)釋放事務(wù)過程中的鎖),外界無法修改這些記錄。
樂觀鎖:Optimistic Lock,和悲歡鎖相反,事務(wù)每次去操作數(shù)據(jù)之前,都假設(shè)其他事務(wù)不會(huì)修改這些需要訪問的數(shù)據(jù) ,所以 在訪問之前不要求上鎖,只是在進(jìn)行更新修改操作的時(shí)候判斷一下在訪問的期間有沒有其他人修改數(shù)據(jù) 了。它適用于多讀的應(yīng)用類型,沖突真的發(fā)生比較少的時(shí)候就比較好,這樣省去了開銷的開銷,可以提高吞吐量;但如果是真的經(jīng)常要發(fā)生沖突的,那每次還要去判斷進(jìn)行retry,反倒降低的性能,這個(gè)時(shí)候悲歡鎖比較好。數(shù)據(jù)庫如果提供類似于write_condition機(jī)制的其實(shí)都是提供的樂觀鎖。
提交事務(wù):
當(dāng)使用COMMIT語句可以提交事務(wù),當(dāng)執(zhí)行了COMMIT語句后,會(huì)確認(rèn)事務(wù)的變化、結(jié)束事務(wù)、刪除保存節(jié)點(diǎn)、釋放鎖,當(dāng)使用COMMIT語句結(jié)束事務(wù)后,其它會(huì)話將可以查看到事務(wù)變化后的新數(shù)據(jù)
回退事務(wù):
在介紹回退事務(wù)前,先介紹一下保存點(diǎn)(savepoint)的概念和作用,保存點(diǎn)是事務(wù)中的一個(gè)點(diǎn),用于取消部分事務(wù),當(dāng)結(jié)束事務(wù)時(shí),會(huì)自動(dòng)刪除該事務(wù)所定義的所有保存點(diǎn).當(dāng)執(zhí)行rollback時(shí),通過指定保存點(diǎn)可以回退到指定的點(diǎn).
內(nèi)容參考于:http://www.rzrgm.cn/lingyejun/p/7096791.html

浙公網(wǎng)安備 33010602011771號(hào)