oracle數(shù)據(jù)庫 oracle中樂觀鎖、悲觀鎖與共享鎖、排他鎖區(qū)別?
oracle中樂觀鎖、悲觀鎖與共享鎖、排他鎖區(qū)別?個人理解: 排他分為,樂觀排他 悲觀排他,就是樂觀鎖和悲觀鎖的意思, 樂觀與悲觀針對的是數(shù)據(jù)庫而言, 樂觀排他后,別人也能進行數(shù)據(jù)修改,但是當你提交時
oracle中樂觀鎖、悲觀鎖與共享鎖、排他鎖區(qū)別?
個人理解: 排他分為,樂觀排他 悲觀排他,就是樂觀鎖和悲觀鎖的意思, 樂觀與悲觀針對的是數(shù)據(jù)庫而言, 樂觀排他后,別人也能進行數(shù)據(jù)修改,但是當你提交時候發(fā)現(xiàn)數(shù)據(jù)被修改了就會報錯。
悲觀排他后,別人是動不了這些數(shù)據(jù)的。共享鎖不甚了解oracle行級鎖和表級鎖的區(qū)別?
1. 程序中非數(shù)據(jù)庫交互操作導致事務(wù)掛起
將接口調(diào)用或者文件操作等這一類非數(shù)據(jù)庫交互操作嵌入在 SQL 事務(wù)代碼之中,那么整個事務(wù)很有可能因此掛起(接口不通等待超時或是上傳下載大附件)。
2. 事務(wù)中包含性能較差的查詢 SQL
事務(wù)中存在慢查詢,導致同一個事務(wù)中的其他 DML 無法及時釋放占用的行鎖,引起行鎖等待。
3. 單個事務(wù)中包含大量 SQL
通常是由于在事務(wù)代碼中加入 for 循環(huán)導致,雖然單個 SQL 運行很快,但是 SQL 數(shù)量一大,事務(wù)就會很慢。
4. 級聯(lián)更新 SQL 執(zhí)行時間較久
這類 SQL 容易讓人產(chǎn)生錯覺,例如:update A set ... where ...in (select B) 這類級聯(lián)更新,不僅會占用 A 表上的行鎖,也會占用 B 表上的行鎖,當 SQL 執(zhí)行較久時,很容易引起 B 表上的行鎖等待。
5. 磁盤問題導致的事務(wù)掛起
極少出現(xiàn)的情形,比如存儲突然離線,SQL 執(zhí)行會卡在內(nèi)核調(diào)用磁盤的步驟上,一直等待,事務(wù)無法提交。
綜上可以看出,如果事務(wù)長時間未提交,且事務(wù)中包含了 DML 操作,那么就有可能產(chǎn)生行鎖等待,引起報錯。
oracle排它鎖語句加在哪里?
表級排它鎖:LOCKTABLEemployeesINEXCLUSIVEMODENOWAIT行級排它鎖and表級共享鎖select*fromemployeeswhereempno=1111forupdatenowait
oracle共享鎖和獨占鎖的區(qū)別?
相對于oracle 和sqlserver mysql的鎖相對較為簡單也比較少,理解起來不是很難。
- 共享鎖(S):允許一個事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。
- 排他鎖(X):允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫鎖。另外,為了允許行鎖和表鎖共存,實現(xiàn)多粒度鎖機制,InnoDB還有兩種內(nèi)部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。
- 意向共享鎖(IS):事務(wù)打算給數(shù)據(jù)行加行共享鎖,事務(wù)在給一個數(shù)據(jù)行加共享鎖前必須先取得該表的IS鎖。
- 意向排他鎖(IX):事務(wù)打算給數(shù)據(jù)行加行排他鎖,事務(wù)在給一個數(shù)據(jù)行加排他鎖前必須先取得該表的IX鎖。
如果不求甚解的話,了解這個圖就行了: