這個連續(xù)5次不好定義,假設(shè)一個人今天試驗了4次,明天又試驗了一次,那么也可以說是連續(xù)5次(雖然有點抬杠,不過這個也算是連續(xù)5次),這種怎么算?
10年積累的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有黟縣免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
以下純屬猜想,沒有試驗過只是把想到的可能說一說
我能想到的是oracle的一個讓人很頭痛的功能(因為開了這個功能的話,真的比較恐怖)——審計。這個功能會記錄登錄失敗的信息在相關(guān)的表中,比如aud$,如果能建立觸發(fā)器對該表進行統(tǒng)計,那么應(yīng)該能實現(xiàn)你說的連續(xù)5次,但是這個就好像和profile沒什么關(guān)系了??赡苄枰謩渔i定用戶了,然后再開啟一個定時任務(wù),一旦執(zhí)行了所應(yīng)用戶的操作(基本上又是一個c觸發(fā)器),那么5分鐘后執(zhí)行解鎖用戶,不過這個環(huán)節(jié)也太多了,而且oracle的兩個計劃任務(wù)有時也不怎么靠譜,萬一有一個環(huán)節(jié)卡死了,那么整套流程就進行不下去了。感覺好像更麻煩的樣子。
如果不在oracle的層面可能就會好解決一些,如果外面套了一層java的殼,那么簡單的做一個循環(huán)就好了,只要在多長時間內(nèi)(比如24小時)循環(huán)到5,或者連續(xù)循環(huán)到5,那么就鎖定斷開該登錄(拒絕登錄)5分鐘,根本不用鎖定用戶(畢竟別人還要用)。(個人不會java,以上純屬猜測)
我記得還有一種方式可以將登錄失敗的信息記錄到alert文件,但是就算能統(tǒng)計出來連續(xù)5次,然后呢,這個5怎么傳入數(shù)據(jù)庫,傳入后怎么操作,我想了半天也沒想明白。畢竟frofile本身,沒有“連續(xù)密碼錯誤”的這個參數(shù)。
ORACLE鎖具體分為以下幾類:
1.按用戶與系統(tǒng)劃分,可以分為自動鎖與顯示鎖
自動鎖:當(dāng)進行一項數(shù)據(jù)庫操作時,缺省情況下,系統(tǒng)自動為此數(shù)據(jù)庫操作獲得所有有必要的
顯示鎖:某些情況下,需要用戶顯示的鎖定數(shù)據(jù)庫操作要用到的數(shù)據(jù),才能使數(shù)據(jù)庫操作執(zhí)行得更好,顯示鎖是用戶為數(shù)據(jù)庫對象設(shè)定的。
2.按鎖級別劃分,可分為共享鎖與排它鎖
共享鎖:共享鎖使一個事務(wù)對特定數(shù)據(jù)庫資源進行共享訪問——另一事務(wù)也可對此資源進行訪問或獲得相同共享鎖。共享鎖為事務(wù)提供高并發(fā)性,但如拙劣的事務(wù)設(shè)計+共享鎖容易造成死鎖或數(shù)據(jù)更新丟失。
排它鎖:事務(wù)設(shè)置排它鎖后,該事務(wù)單獨獲得此資源,另一事務(wù)不能在此事務(wù)提交之前獲得相同對象的共享鎖或排它鎖。
3.按操作劃分,可分為DML鎖、DDL鎖
+DML鎖又可以分為,行鎖、表鎖、死鎖
-行鎖:當(dāng)事務(wù)執(zhí)行數(shù)據(jù)庫插入、更新、刪除操作時,該事務(wù)自動獲得操作 表中操作行的排它鎖。
-表級鎖:當(dāng)事務(wù)獲得行鎖后,此事務(wù)也將自動獲得該行的表鎖(共享鎖),以防止其它事務(wù)進行DDL語句影響記錄行的更新。事務(wù)也可以在進行 過程中獲得共享鎖或排它鎖,只有當(dāng)事務(wù)顯示使用LOCK TABLE語 句顯示的定義一個排它鎖時,事務(wù)才會獲得表上的排它鎖,也可使用
LOCK TABLE顯示的定義一個表級的共享鎖(LOCK TABLE具體用法請參 考相關(guān)文檔)。
-死鎖:當(dāng)兩個事務(wù)需要一組有沖突的鎖,而不能將事務(wù)繼續(xù)下去的話,就 出現(xiàn)死鎖。
如事務(wù)1在表A行記錄#3中有一排它鎖,并等待事務(wù)2在表A中記錄#4 中排它鎖的釋放,而事務(wù)2在表A記錄行#4中有一排它鎖,并等待事務(wù) 1在表A中記錄#3中排它鎖的釋放,事務(wù)1與事務(wù)2彼此等待,因此就造 成了死鎖。死鎖一般是因拙劣的事務(wù)設(shè)計而產(chǎn)生。
死鎖只能使用SQL下:alter system kill session 'sid,serial#';
或者使用相關(guān)操作系統(tǒng)kill進程的命令,如UNIX下kill -9 sid,或者 使用其它工具殺掉死鎖進程。
+DDL鎖又可以分為:排它DDL鎖、共享DDL鎖、分析鎖
-排它DDL鎖:創(chuàng)建、修改、刪除一個數(shù)據(jù)庫對象的DDL語句獲得操作對象的 排它鎖。
如使用alter table語句時,為了維護數(shù)據(jù)的完成性、一致性、
合法性,該事務(wù)獲得一排它DDL鎖。
-共享DDL鎖:需在數(shù)據(jù)庫對象之間建立相互依賴關(guān)系的DDL語句通常需共享
獲得DDL鎖。
如創(chuàng)建一個包,該包中的過程與函數(shù)引用了不同的數(shù)據(jù)庫表,
當(dāng)編譯此包時,該事務(wù)就獲得了引用表的共享DDL鎖。
-分析鎖:ORACLE使用共享池存儲分析與優(yōu)化過的SQL語句及PL/SQL程序,使
運行相同語句的應(yīng)用速度更快。一個在共享池中緩存的對象獲得
它所引用數(shù)據(jù)庫對象的分析鎖。分析鎖是一種獨特的DDL鎖類型,
ORACLE使用它追蹤共享池對象及它所引用數(shù)據(jù)庫對象之間的依賴 關(guān)系。當(dāng)一個事務(wù)修改或刪除了共享池持有分析鎖的數(shù)據(jù)庫對象
時,ORACLE使共享池中的對象作廢,下次在引用這條SQL/PLSQL語 句時,ORACLE重新分析編譯此語句。
4.內(nèi)部閂鎖
內(nèi)部閂鎖:這是ORACLE中的一種特殊鎖,用于順序訪問內(nèi)部系統(tǒng)結(jié)構(gòu)。
當(dāng)事務(wù)需向緩沖區(qū)寫入信息時,為了使用此塊內(nèi)存區(qū)域, ORACLE首先必須取得這塊內(nèi)存區(qū)域的閂鎖,才能向此塊內(nèi)存寫入
信息。
這些是基礎(chǔ),必須掌握:鎖定的概念:鎖定是數(shù)據(jù)庫用來控制共享資源并發(fā)布訪問的機制。在多用戶環(huán)境下,多個用戶可同時訪問相同的數(shù)據(jù)。Oracle 提供鎖以確保在多用戶環(huán)境下數(shù)據(jù)的完整性和一致性。在提交或回滾事務(wù)之前,Oracle 會鎖定正被修改的數(shù)據(jù)。在用戶完成或回滾事務(wù)之后,鎖會自動釋放。只有在提交或回滾事物之后,其他用戶才可以更新這些數(shù)據(jù)。鎖的兩種級別為:行級鎖和表級鎖。行級鎖主要用于特定的行,表級鎖主要用于整個表,下面我就行級鎖和表級鎖來個說明:行級鎖行級鎖只對用戶正在訪問的行進行鎖定。如果該用戶正在修改某行,那么其他用戶就可以更新同一表中該行之外的數(shù)據(jù)。例如:如果用戶1正在更新Jobs 表中的第一行,則用戶2可以同時修改該表中的第二行。也就是說除了該表中的第一行,其他用戶可以修改任意行,但是第一行的數(shù)據(jù)其他用戶只能select。行級鎖是一種排他鎖,防止其他事務(wù)修改此行,但是不會阻止讀取此行的操作。在使用INSERT、UPDATE、DELETE 和SELECT…FOR UPDATE 等 語句時,Oracle 會自動應(yīng)用行級鎖鎖定。SELECT...FOR UPDATE 語句允許用戶每次選擇多行記錄進行更新,這些記錄會被鎖定,且只能由發(fā)起查詢的用戶進行編輯。只有在回滾或提交事務(wù)之后,鎖定才會釋放,其他用戶才可以編輯這些記錄。SELECT...FOR UPDATE 語句的語法如下: SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT];其中:OF 子句用于指定即將更新的列,即鎖定行上的特定列。WAIT 子句指定等待其他用戶釋放鎖的秒數(shù),防止無限期的等待?!笆褂肍OR UPDATE WAIT”子句的優(yōu)點如下:⒈防止無限期地等待被鎖定的行;⒉允許應(yīng)用程序中對鎖的等待時間進行更多的控制。⒊對于交互式應(yīng)用程序非常有用,因為這些用戶不能等待不確定舉例:比如一個用戶在SQL PLUS下輸入這條語句:SQLSELECT * FROM order_master WHERE vencode='V002' FOR UPDATE;此時再開啟一個SQL PLUS,以相同的用戶登陸,執(zhí)行下面的命令。SQL SELECT * FROM order_master WHERE vencode='V02' FOR UPDATE WAIT 5;由于要更新的行已經(jīng)被鎖定,上述命令在等待5秒鐘之后返回,并給出如下的錯誤信息:ERROR 位于第1行;ORA-30006;資源已被占用;執(zhí)行操作時出現(xiàn)WAIT超時。PS:再開啟的SQL PLUS 是以相同用戶登陸的,用其他用戶登陸更是不可能。表級鎖表級鎖被鎖定的表,暫時放在內(nèi)存中,不提交不進去數(shù)據(jù)庫,也就是說,多個用戶在同一時間,同時修改同一個表的同一行時,同時點提交,但是還是按隨機的先后被提交進數(shù)據(jù)庫,而不是同時被提交,而是先隨機存儲后,被再次提交的覆蓋。表級鎖將保護表數(shù)據(jù),在事務(wù)處理過程中,表級鎖會限制對整個表的訪問??梢允褂肔OCK TABLE 語句顯示地鎖定表。表級鎖用來限制對表執(zhí)行添加、更新和刪除等修改操作。鎖定表的語法如下:LOCK TABLE table_name IN lock_mode MODE [NOWAIT];其中:lock_mode 是鎖定的模式。NOWAIT 關(guān)鍵字用于防止無限期的等待其他用戶釋放鎖。表級鎖的模式包括以下內(nèi)容:行共享 (ROW SHARE, RS): 允許其他用戶訪問和鎖定該表,但是禁止排他鎖定整個表。行共享鎖鎖定后,在同一時刻,不同用戶可以對同一個表中的被行共享鎖鎖定后的該行,具備增、刪、改、查的功能。行排他(ROW EXCLUSIVE, RX):與行共享模式相同,同時禁止其他用戶在此表上使用共享鎖。使用SELECT...FOR UPDATE 語句會在表上自動應(yīng)用排他鎖。被行排他后,其他用戶不能同時修改該行,但是可以插入行,可以查詢該行,其他用戶也不能再在該表上對此行進行排他。共享(SHARE, S):共享鎖將鎖定表,僅允許其他用戶查詢表中的行,但不允許插入、更新或刪除行。多個用戶可以同時在同一個表中放置共享鎖,即允許資源共享,因此得名“共享鎖”。例如,如果用戶每天都需要在結(jié)帳時更新日銷售表,則可以在更改該表時使用共享鎖以確保數(shù)據(jù)的一致性。也就是說該表只能查,其他用戶想修改表中行的數(shù)據(jù),只需要對該表進行共享鎖。共享行排他(SHARE ROW EXCLUSIVE , SPX):執(zhí)行比共享表更多的限制。防止其他事務(wù)在表上應(yīng)用共享鎖、共享行排他鎖以及排他鎖。共享行排他是除了該行以外的其他行也不能增、刪、改。只能在此表中加低級表。要是想在該表中更改其他行的數(shù)據(jù),就只有其他用戶對該行進行共享行排他鎖,也僅僅只能修改被這個用戶鎖定的行,而其他的行也修改不了。排他(EXCLUSIVE,E):對表執(zhí)行最大限制。除了允許其他用戶查詢該表的記錄,排他鎖防止其他事務(wù)對表做任何更改或在表上應(yīng)用任何類型的鎖。這個鎖應(yīng)該叫鎖中之王,他鎖住了的話,其他用戶就只有查詢的功能了,就別想在該表中干別的事了。BTW:在能加很多鎖的表中,如果第一個用戶對該表鎖定時,沒有使用“NOWAIT”語句,是需要第一個用戶對該表COMMIT或ROLLBACK 命令釋放鎖定后,其他用戶才能對該表進行鎖定。如果其他用戶違反了該條,就會無期限的等待。。。。SQL LOCK TABLE order_mater IN SHARE MODE;而使用下面的語句就可以很少的預(yù)防這種情況的存在:SQL LOCK TBALE order_mater IN SHARE MODE NOWAIT;這是些擴展的內(nèi)容,供大家參考
1 引言—數(shù)據(jù)庫鎖的基本概念 為了確保并發(fā)用戶在存取同一數(shù)據(jù)庫對象時的正確性(即無丟失修改、可重復(fù)讀、不讀“臟”數(shù)據(jù)),數(shù)據(jù)庫中引入了鎖機制?;镜逆i類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。 排它鎖:若事務(wù)T對數(shù)據(jù)D加X鎖,則其它任何事務(wù)都不能再對D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數(shù)據(jù)前要向該數(shù)據(jù)加排它鎖,所以排它鎖又稱為寫鎖。 共享鎖:若事務(wù)T對數(shù)據(jù)D加S鎖,則其它事務(wù)只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數(shù)據(jù)前要向該數(shù)據(jù)加共享鎖,所以共享鎖又稱為讀鎖。 2 Oracle 多粒度封鎖機制介紹 根據(jù)保護對象的不同,Oracle數(shù)據(jù)庫鎖可以分為以下幾大類: (1) DML lock(data locks,數(shù)據(jù)鎖):用于保護數(shù)據(jù)的完整性; (2) DDL lock(dictionary locks,字典鎖):用于保護數(shù)據(jù)庫對象的結(jié)構(gòu)(例如表、視圖、索引的結(jié)構(gòu)定義); (3) internal locks 和l a t c h es(內(nèi)部鎖與閂):保護內(nèi)部數(shù)據(jù)庫結(jié)構(gòu); (4) distributed locks(分布式鎖):用于OPS(并行服務(wù)器)中; (5) PCM locks(并行高速緩存管理鎖):用于OPS(并行服務(wù)器)中。 本文主要討論DML(也可稱為data locks,數(shù)據(jù)鎖)鎖。從封鎖粒度(封鎖對象的大?。┑慕嵌瓤?,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。 2.1 Oracle的TX鎖(行級鎖、事務(wù)鎖) 許多對Oracle不太了解的技術(shù)人員可能會以為每一個TX鎖代表一條被封鎖的數(shù)據(jù)行,其實不然。TX的本義是Transaction(事務(wù)),當(dāng)一個事務(wù)第一次執(zhí)行數(shù)據(jù)更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務(wù))鎖,直至該事務(wù)結(jié)束(執(zhí)行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應(yīng)多個被該事務(wù)鎖定的數(shù)據(jù)行。 在Oracle的每行數(shù)據(jù)上,都有一個標(biāo)志位來表示該行數(shù)據(jù)是否被鎖定。Oracle不象其它一些DBMS(數(shù)據(jù)庫管理系統(tǒng))那樣,建立一個鏈表來維護每一行被加鎖的數(shù)據(jù),這樣就大大減小了行級鎖的維護開銷,也在很大程度上避免了其它數(shù)據(jù)庫系統(tǒng)使用行級封鎖時經(jīng)常發(fā)生的鎖數(shù)量不夠的情況。數(shù)據(jù)行上的鎖標(biāo)志一旦被置位,就表明該行數(shù)據(jù)被加X鎖,Oracle在數(shù)據(jù)行上沒有S鎖。
2.2 TM鎖(表級鎖) 2.2.1 意向鎖的引出 表是由行組成的,當(dāng)我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務(wù)要在一個表上加S鎖,如果表中的一行已被另外的事務(wù)加了X鎖,那么該鎖的申請也應(yīng)被阻塞。如果表中的數(shù)據(jù)很多,逐行檢查鎖標(biāo)志的開銷將很大,系統(tǒng)的性能將會受到影響。為了解決這個問題,可以在表級引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。 意向鎖的含義是如果對一個結(jié)點加意向鎖,則說明該結(jié)點的下層結(jié)點正在被加鎖;對任一結(jié)點加鎖時,必須先對它的上層結(jié)點加意向鎖。如:對表中的任一行加鎖時,必須先對它所在的表加意向鎖,然后再對該行加鎖。這樣一來,事務(wù)對表加鎖時,就不再需要檢查表中每行記錄的鎖標(biāo)志位了,系統(tǒng)效率得以大大提高。 2.2.2 意向鎖的類型 由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖: 意向共享鎖(Intent Share Lock,簡稱IS鎖):如果要對一個數(shù)據(jù)庫對象加S鎖,首先要對其上級結(jié)點加IS鎖,表示它的后裔結(jié)點擬(意向)加S鎖; 意向排它鎖(Intent Exclusive Lock,簡稱IX鎖):如果要對一個數(shù)據(jù)庫對象加X鎖,首先要對其上級結(jié)點加IX鎖,表示它的后裔結(jié)點擬(意向)加X鎖。 另外,基本的鎖類型(S、X)與意向鎖類型(IS、IX)之間還可以組合出新的鎖類型,理論上可以組合出4種,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實際上只有S+IX有新的意義,其它三種組合都沒有使鎖的強度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這里的“=”指鎖的強度相同)。所謂鎖的強度是指對其它鎖的排斥程度。 這樣我們又可以引入一種新的鎖的類型。 共享意向排它鎖(Shared Intent Exclusive Lock,簡稱SIX鎖) :如果對一個數(shù)據(jù)庫對象加SIX鎖,表示對它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務(wù)對某個表加SIX鎖,則表示該事務(wù)要讀整個表(所以要對該表加S鎖),同時會更新個別行(所以要對該表加IX鎖)。 這樣數(shù)據(jù)庫對象上所加的鎖類型就可能有5種:即S、X、IS、IX、SIX。 具有意向鎖的多粒度封鎖方法中任意事務(wù)T要對一個數(shù)據(jù)庫對象加鎖,必須先對它的上層結(jié)點加意向鎖。申請封鎖時應(yīng)按自上而下的次序進行;釋放封鎖時則應(yīng)按自下而上的次序進行;具有意向鎖的多粒度封鎖方法提高了系統(tǒng)的并發(fā)度,減少了加鎖和解鎖的開銷。 2.2.3 Oracle的TM鎖(表級鎖) Oracle的DML鎖(數(shù)據(jù)鎖)正是采用了上面提到的多粒度封鎖方法,其行級鎖雖然只有一種(即X鎖),但其TM鎖(表級鎖)類型共有5種,分別稱為共享鎖(S鎖)、排它鎖(X鎖)、行級共享鎖(RS鎖)、行級排它鎖(RX鎖)、共享行級排它鎖(SRX鎖),與上面提到的S、X、IS、IX、SIX相對應(yīng)。需要注意的是,由于Oracle在行級只提供X鎖,所以與RS鎖(通過SELECT … FOR UPDATE語句獲得)對應(yīng)的行級鎖也是X鎖(但是該行數(shù)據(jù)實際上還沒有被修改),這與理論上的IS鎖是有區(qū)別的。 下表為Oracle數(shù)據(jù)庫TM鎖的相容矩陣(Y=Yes,表示相容的請求; N=No,表示不相容的請求;-表示沒有加鎖請求):
T2
T1 S X RS RX SRX -
----------------------------------------------------
S Y N Y N N Y
X N N N N N Y
RS Y N Y Y Y Y
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y
表一:Oracle數(shù)據(jù)庫TM鎖的相容矩陣 一方面,當(dāng)Oracle執(zhí)行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML語句時,系統(tǒng)自動在所要操作的表上申請表級RS鎖(SELECT…FOR UPDATE)或RX鎖(INSERT、UPDATE、DELETE),當(dāng)表級鎖獲得后,系統(tǒng)再自動申請TX鎖,并將實際鎖定的數(shù)據(jù)行的鎖標(biāo)志位置位(指向該TX鎖);另一方面,程序或操作人員也可以通過LOCK TABLE語句來指定獲得某種類型的TM鎖。下表總結(jié)了Oracle中各SQL語句產(chǎn)生TM鎖的情況: SQL語句 表鎖模式 允許的鎖模式
-------------------------------------------------------------------------------------------------
Select * from table_name…… 無 RS、RX、S、SRX、X
Insert into table_name…… RX RS、RX
Update table_name…… RX RS、RX
Delete from table_name…… RX RS、RX
Select * from table_name for update RS RS、RX、S、SRX
lock table table_name in row share mode RS RS、RX、S、SRX
lock table table_name in row exclusive mode RX RS、RX
lock table table_name in share mode S RS、S
lock table table_name in share row exclusive mode SRX RS
lock table table_name in exclusive mode X 無
1、在做Oracle監(jiān)聽程序測試時,發(fā)現(xiàn)帳戶已經(jīng)被鎖定。
2、在數(shù)據(jù)庫安裝電腦上,點擊開始打開運行窗口。
3、在運行窗口輸入CMD,調(diào)出命令提示符界面。
3、在命令提示符下面,用管理員身份登入到數(shù)據(jù)庫sqlplus / as sysdba。
4、輸入解鎖命令alter user Scott account unlock后回車。
5、看見用戶已更改的字樣,表示命令已成功執(zhí)行。
6、再切換到監(jiān)聽程序驗證,原來的ora-28000帳戶被鎖定的提示已經(jīng)不存在了。用戶解鎖成功。