Oracle數(shù)據(jù)庫更新_第1頁
Oracle數(shù)據(jù)庫更新_第2頁
Oracle數(shù)據(jù)庫更新_第3頁
Oracle數(shù)據(jù)庫更新_第4頁
Oracle數(shù)據(jù)庫更新_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第11章數(shù)據(jù)庫更新f主要內(nèi)容奧返回總目錄J添加數(shù)據(jù)J刪除數(shù)據(jù)更新數(shù)據(jù)事務(wù)J鎖F一個數(shù)據(jù)庫能否保持信息的正確性、及時性,很大程度上依賴于數(shù)據(jù)庫的更新功能的強(qiáng)弱與實時。數(shù)據(jù)庫的更新包括插入、刪除、修改(也稱為更新)三種操作。本章將分別講述如何使用這些操作,以便有效地更新數(shù)據(jù)庫。11.1添加數(shù)據(jù)在SQLServer中町以在EnteipriseManager中查看數(shù)據(jù)庫表的數(shù)據(jù)時添加數(shù)據(jù),但這種方式不能應(yīng)付數(shù)據(jù)的人量插入,需要使用INSERT語句來解決這個問題。INSERT語法數(shù)據(jù)庫的信息時常需要改變,用戶需要添加數(shù)據(jù),INSERT語句提供了此功能.INSERT語句通常苗兩種形式。一種是插入一條記錄;

2、另一種是插入子查詢的結(jié)果。后者可以一次插入多條記錄。INSERT語句語法如匚INSERTINTOtablenameWITH(n)|viewname|rowsetfunctionlimited(columnlis切VALUES(DEFAULT|NULL|expression,.n)|derivedtable|executestatement|DEFAULTVALUES各參數(shù)說明如F:INTO用在INSERT關(guān)鍵字和目標(biāo)表Z間的可選關(guān)鍵字。table_name指定目標(biāo)數(shù)據(jù)庫表。WITH(.n)指定一個或多個目標(biāo)表允許的表線索。有關(guān)表線索的集中介紹請參見卜一節(jié)“刪除數(shù)據(jù)”中的DELETE語法。vie

3、v/_name指定視圖名稱。rovzset_function_limited行集合函數(shù)限制,即使用OPENQUERY()或OPENROWSET()函數(shù)。column_list指定要插入數(shù)據(jù)的列。列Z間用逗號隔開。SQLServer可以為以下的列自動生成一個值:IDENTITY列、TIMESTAMP列、有缺省值的列或允許NULL值的列。VALUES指定對應(yīng)Jcolumn的值。DEFAULT指定SQLServer使用為此列指定的缺省值。Expression指定一個常數(shù)、變最或表達(dá)式。表達(dá)式中不能含有SELECT或EXECUTE語句。denveditable指定一個返回數(shù)據(jù)行的SELECT語句。ex

4、ecutestatement指定一個返回SELECT或READTEXT語旬的EXECUTE語句。其返回集必須與columnjist中指定的列一致或兼容。DEFAULTVALUES讓所有的列使用缺省值作為插入數(shù)據(jù)。當(dāng)括入VARBINARY類型的數(shù)據(jù)吋.其尾部的u(廣將被去掉.當(dāng)括入VARCHAR或TEXT類型約數(shù)據(jù)吋,其后的空格將被去掉,如果插入一個只含空格的字符串,則會被認(rèn)為插入了一個長度為零的字符串.1ID匕NI11Y列不能笛疋孜枯,往VALUES列衣甲脛跳迄此列.對字符類型的列,當(dāng)描入數(shù)據(jù),特別是括入字符串中含有數(shù)字字符以外的字符時,畏好用引號將其括起來,否則容易出錯:coluimijis

5、t中列的順序可以與表結(jié)枸中的順序不同,但VALUES中的值必須與columnJist11.1.2插入單行以F舉例說明如何插入單行數(shù)據(jù)。例11-1:插入數(shù)據(jù)到訂購商信息表中。usepanguinsertfirms(firm_id,f_naine,f_intro)values(10070001,SQL制作數(shù)據(jù)庫軟件的公司?運行結(jié)果如下:(1row(s)affected)例11七插入數(shù)據(jù)到訂購商信息表中。usepanguinsertfirms/*當(dāng)表中所有的列均被指定時,可以省略columnJist*/values(10070001JSQU,制作數(shù)據(jù)庫軟件的公司;100700010007,|0012

6、345678:234325,chengdu,)11.1.3插入子查詢結(jié)果子查詢不僅可以嵌套在SELECT語句中,用以構(gòu)造父查詢的條件,也可以嵌套在INSERT語句中,用以生成要插入的數(shù)據(jù)。插入子查詢的INSERT語句語法如卜:INSERTINTOtablenameWITH(n)|viewname|rowsetfunctionlimited(columnlis切subquery其功能是以批量插入,一次將子查詢的結(jié)果全部插入指定表中。例11-3:對每個部門,求員工總數(shù),并把結(jié)果存入depailment_info表中。usepanguinsertintodepartment_info(dept_id

7、,e_num)selectdept_id,count(*)&omemployeegroupbydept_idselect*&omdeptmentjnfo運行結(jié)果如下:(7row(s)affected)dept_idd_chief_namedjocatione_numd_wage1001dboNULL3NULL1002dboNULL5NULL11.1.4用存儲過程插入數(shù)據(jù)在INSERT語句中可以通過執(zhí)行存儲過程來取得要插入的數(shù)據(jù)。所插入的數(shù)據(jù)是存儲過程中SELECT語句所檢索的結(jié)果集。使用存儲過程插入數(shù)據(jù)的語法如F:INSERTINTOtablenameWITH(n)|viewname|rows

8、etfunctionlimited(columnlis切EXECUTEprocedure其中procedure既可以是一個已經(jīng)存在的系統(tǒng)存儲過程或用戶自定義的存儲過程,也可以在INSERT語句中直接編寫存儲過程。例11-4:對每個部門,求員工工資總額,并把結(jié)果存入department_info表中。usepanguinsertintodepartmentjnfo(dept_id,d_wage)execute(selectdept_id,sum(e_wage)&omemployeegroupbydept_id)select*&omdepartmentjnfo運行結(jié)果如下:(7row(s)affe

9、cted)dept_idd_chief_namedjocatione_numd_wage1001dboNULLNULL15000.00001002dboNULLNULL19500.000011.2刪除數(shù)據(jù)DELETE語法DELETE語句用來從表中刪除數(shù)據(jù),其語法為:DELETEFROMtablenameWITH(n)|viewname|rowsetfunctionlimitedFROM,.nWHERE|CURRENTOFGLOBALcursorname|cursorvariablenameOPTION(,.n):=tablenameAStablealiasWITH(,.n)|viewnameA

10、Stablealias|rowsetfunctionAStablealias|derivedtableAStablealias(columnalias)|:=ON|CROSSJOIN|:=INNER|LEFT|RIGHT|FULLOUTERJOIN:=FASTFIRSTROW|HOLDLOCK|PAGLOCK|READCOMMITTED|REPEATABLEREAD|ROWLOCK|SERIALIZABLE|TABLOCK|UPDLOCK:=INDEX(index_val,.n)|FASTFIRSTROW|HOLDLOCK|NOLOCK|PAGLOCK|READCOMMITTED|READPA

11、ST|READUNCOMMITTED|REPEATABLEREAD|ROWLOCK|SERIALIZABLE|TABLOCK|TABLOCKX|UPDLOCK:=HASH|ORDERGROUP|CONCAT|HASH|MERGEUNION|FASTnumberrows|FORCEORDER|MAXDOP|ROBUSTPLAN|KEEPPLAN各參數(shù)說明如F:FROM此參數(shù)為可選選項,用于連接DELETE關(guān)鍵字和要刪除數(shù)據(jù)的対彖名稱。tablename指定要刪除數(shù)據(jù)的表。WITH(.n)指定一個或多個目標(biāo)表允許的表提示。view_name指定用丁刪除數(shù)據(jù)的視圖。rovzset_function_

12、limited行集合函數(shù)限制,即使用OPENQUERY()或OPENROWSET()函數(shù)。FROM指定一個額外的FROM子句。這是DELETE命令在Transact-SQL語言中的擴(kuò)展,它允許同時刪除多個表中的數(shù)據(jù)。其所含的參數(shù)包括joinjable.join_type等,與第10章“數(shù)據(jù)查詢”中FROM子句中所講的一致。WHERE指定限制數(shù)據(jù)刪除的條件。如果不指定WHERE子旬,就會刪除表中的所有數(shù)據(jù)。在WHERE子句中指定兩種形式的刪除操作。一種是搜索刪除,即使用搜索條件來限定要刪除的數(shù)據(jù)行;另一種是定位刪除,即使用CURRENTOF子句來指定一個游標(biāo),刪除操作會在游標(biāo)的當(dāng)前位置產(chǎn)生。定位

13、刪除比搜索刪除更精確。GLOBAL說明要使用的游標(biāo)是全局游標(biāo)。如果不使用此選項,而又存在一個全局游標(biāo)和一個局部游標(biāo)同名的情況時,系統(tǒng)認(rèn)為所選擇的游標(biāo)是局部游標(biāo)。cursor_name指定打開的游標(biāo)名稱。此游標(biāo)必須是允許更新的。cursorvariablename指定游標(biāo)變最的名稱。此游標(biāo)變最必須是允許更新的。OPTION(,.n)請參見第10章“數(shù)據(jù)查詢”中OPTION子句中所講述的參數(shù)。table_hint表提示用于指定一個表的掃描計劃,即將要用于查詢優(yōu)化器的一個或多個索引,或一個用丁檢索數(shù)據(jù)的鎖定方法。此選項一般來說不必使用,查詢優(yōu)化器會自動選擇一個最優(yōu)的執(zhí)行方案。各表提示Z間應(yīng)使用逗號隔

14、開。INDEX(index_val,-.n)指定索引提示,即當(dāng)執(zhí)行命令時由SQLServer使用的索引的名稱或ID號。每個表只能指定一個索引提示。在表提示中最多可以指定250非簇索引。FASTFIRSTROW等價TOPTION(FAST1),即對第一行返回數(shù)據(jù)采用查詢優(yōu)化。HOLDLOCK一般情況下,當(dāng)執(zhí)行SELECT命令時,SQLServer會在選取數(shù)據(jù)的過程中對該數(shù)據(jù)所屬的數(shù)據(jù)頁設(shè)定一個共享鎖(SharedLock,關(guān)于鎖的介紹請參見本章后部分)。當(dāng)SQLServer讀到下一個數(shù)據(jù)頁的數(shù)據(jù)時,上一個數(shù)據(jù)頁的共享鎖就會被解除。但如果使用了HOLDLOCK選項,則在整個SELECT命令執(zhí)行的過

15、程中設(shè)定的共享鎖會一直存在。此選項不能在帶FORBROWSE子句的SELECT語句中使用。此選項等價于SERIALIZABLE選項。NOLOCK一般情況下,當(dāng)執(zhí)行SELECT命令時,SQLServer會在選取數(shù)據(jù)的過程中對該數(shù)據(jù)所屬的數(shù)據(jù)頁設(shè)定一個共享鎖(SharedLock,關(guān)于鎖的介紹請參見本章后部分)。但如果使用了NOLOCK選項,則SQLSeiver不會指定共享鎖,而且不管其它用戶是否正在更改所讀取的數(shù)據(jù),SELECT命令仍然可以讀取數(shù)據(jù)。因此,使用此選項可能會讀取到其它用戶尚未提交的數(shù)據(jù)。此選項等價于READUNCOMhCTTED選項。PAGLOCK指定在SELECT命令執(zhí)行時使用對

16、數(shù)據(jù)頁做共享鎖。這是SQLSeiver的內(nèi)定方式。READCOMMITTED指定數(shù)據(jù)掃描執(zhí)行時使用與運行在READCOMMITTED孤立級上的事務(wù)相同的鎖語義。即SELECT命令不會返回尚未提交的數(shù)據(jù)。READPAST跳過目前被鎖定的行。此選項只用丁在事務(wù)運行在READCOMMITTED孤立級上的情況下。READUNCOMMITTED此選項等價亍NOLOCK選項。REPEATABLEREAD指定數(shù)據(jù)掃描執(zhí)行時使用與運行在REPEATABLEREAD孤立級上的事務(wù)相同的鎖語義。即用SELECT命令讀取的數(shù)據(jù)在整個命令執(zhí)行過程中不會被更改。此選項會影響系統(tǒng)的效能,非必要情況最好不用此選項。ROWL

17、OCK指定使用共享的行數(shù)據(jù)鎖,即使用行級別鎖定。SERIALIZABLE此選項等價JHOLDLOCK選項。TABLOCK指定用SELECT命令讀取數(shù)據(jù)時対所選取的表的全部數(shù)據(jù)做鎖定,直到整個命令執(zhí)行完畢。如果指定了HOLDLOCK選項,則共享的表鎖定會維持到事務(wù)結(jié)束。TABLOCKX指定用SELECT命令讀取數(shù)據(jù)時対所選取的表的全部數(shù)據(jù)做鎖定,直到整個命令或事務(wù)執(zhí)行完畢。UPDLOCK指定在SELECT命令執(zhí)行時使用更新鎖(UpdateLock),而不使用共享鎖,并且此更新鎖將維持到命令執(zhí)行結(jié)束為止。11.2.2用DELETE刪除數(shù)據(jù)刪除一條記錄例11-5:刪除編號為*10031011*的員工

18、記錄。usepangudelete&omemployeewhereemp_id=*10031011*刪除多條記錄例11-6:刪除所有的部門信息記錄。usepangudelete&omdepartment_info/*或使用deletedepartment_info*/這個例子刪除了depailment_info表中的所有數(shù)據(jù),使它成為空表。帶子查詢的刪除語句子查詢同樣可以嵌套在DELETE語句中,用以構(gòu)造執(zhí)行刪除操作的條件。例11-7:刪除后勤部所有員工的記錄。usepangudeletefromemployeewheredept_id=(selectdept_id&omdepartmentw

19、hered_nanie=后勤部)例11-8:刪除訂貨表前100項記錄中所有產(chǎn)品編號為1003002,的產(chǎn)品。usepangudeleteordersfrom(selecttop100*fromorders)asorderstoplOOwhereorders.pjd=orderstoplOOp_id刪除當(dāng)前游標(biāo)行數(shù)據(jù)例11-9:刪除游標(biāo)dinfo_cursor所指定的數(shù)據(jù)行。deletefromdepartment_infowherecurrentofdinfo_cursor11.2.3TRUNCATETABLE命令如果要刪除表中的所有數(shù)據(jù),那么使用TRUNCATETABLE命令比用DELETE

20、命令快得多。因為DELETE命令除了刪除數(shù)據(jù)外,還會対所刪除的數(shù)據(jù)在事務(wù)處理口志中作記錄,以防止刪除失敗時可以使用事務(wù)處理口志來恢復(fù)數(shù)據(jù);而TRUNCATETABLE則只做刪除與表有關(guān)的所有數(shù)據(jù)頁的操作。TRUNCATETABLE命令功能上相當(dāng)于使用不帶WHERE子句的DELETE命令。但是TRUNCATETABLE命令不能用于被別的表的外關(guān)鍵字依賴的表。TRUNCATETABLE命令語法如F:TRUNCATETABLEtablename活觸發(fā)器例11-10:刪除所有的部門信息記錄。usepangutruncatetabledepartmentjnfo11.3更新數(shù)據(jù)UPDATE語法用戶可以用

21、UPDATE語句來更新表中一列或多列數(shù)據(jù)值,其語法如F:UPDATEtablenameWITH(n)|viewname|rowsetfunctionlimitedSETcolumnname=expression|DEFAULT|NULL|valiable=expression|variable=column=expressionFROMWHERE|WHERECURRENTOFGLOBALcursorname|cursorvariablenameOPTION(Ln)各參數(shù)說明如F:SETSET子句用丁指定更新的方法,即用expression的值取代相應(yīng)的列的值。如果省略WHERE子句,那么表中的

22、所有數(shù)據(jù)均會受到影響。在FROM子句中指定的表或列的別名不能用于SET子句中。column_name指定要更新數(shù)據(jù)的列。IDENTITY列不能被更新。expression可以是常量、變量、表達(dá)式或返回單個值的子查詢。DEFAULT指定使用己經(jīng)定義的缺省值作為列的值。NULL指定使用NULL值作為列的值。vanable事先定義的變杲,用丁存儲表達(dá)式的值。應(yīng)注意SETvariable=column=expression將變彊和列設(shè)定為與表達(dá)式相同的值,它與SETvanable=column,coluinn=expression語句不同,后者將列的值賦給變量后再將表達(dá)式的值賦給列。其余參數(shù)和注意事項

23、與DELETE語句相同。11.3.2更新記錄更新一條記錄的值例11-11:將部門編號為*1002*的部門名稱改名為財務(wù)部。usepanguupdatedepartmentsetdname=*財務(wù)部,wheredept_id=*1002*更新多個記錄的值例11-12:將所有員工的工資上漲100元。usepanguupdateemployeesete_wage=e_wage+100例11-13:將工作級別為V,的所有員工的工資上漲5%。usepanguupdateemployeesete_wage=e_wage*(1+5%)wherejobJevel=3帶子查詢的更新語句子查詢可以嵌套在UPDAT

24、E語句中,用以構(gòu)造執(zhí)行更新操作的條件。例11-14:將企劃部每位員工的工資上漲100元。usepanguupdateemployeesete_wage=e_wage+100whereemployee.dept_id=(selectdepartmentdept_id&omdepartmentwhered_name=企劃部J4使用連接信息更新數(shù)據(jù)例11-15:在各部門經(jīng)理的工資中加入員工管理費,按其每位員工50元計算。usepanguupdateemployeesete_wage=e_wage+e_num#50&omemployee,departmentwhereemployee.emp_id=d

25、epartment.chiefjd11.3.3大量數(shù)據(jù)更新使用UPDATE更新數(shù)據(jù)時,會將被更新的原數(shù)據(jù)存放到事務(wù)處理口志中。如果所更新的表特別人,則有可能在命令尚未執(zhí)行完時,就將事務(wù)處理口志填滿了。這時SQLServer會生成錯誤信息,并將更新過的數(shù)據(jù)返回原樣。解決此問題有兩種辦法:一種是加人事務(wù)處理口志的存儲空間,但這似乎不人合算;另一種是分解更新語句的操作過程,并及時清理事務(wù)處理口志。例如,將更新命令分解為兩個命令,在其間插入BACKUPLOG命令將事務(wù)處理口志清除(關(guān)于BACKUPLOG命令的詳細(xì)介紹請參見第15章“備份與恢復(fù)”)。例11-16:將訂貨表中的訂購數(shù)量全部設(shè)為lOOOou

26、sepanguupdateordersseto_quantity=1000whereo_date=41999-1-111.4事務(wù)11.4.1事務(wù)的由來使用DELETE命令或UPDATE命令對數(shù)據(jù)庫進(jìn)行更新時一次只能操作一個表,這會帶來數(shù)據(jù)庫的數(shù)據(jù)不一致的問題。例如:企業(yè)取消了后勤部,需耍將后勤部從department表中刪除,要修改department表,而employee表中的部門編號與后勤部相對應(yīng)的員工也應(yīng)刪除。因此,兩個表都需要修改,這種修改只能通過兩條DELETE語句進(jìn)行。假設(shè)后勤部編號為1012,第一條DELETE語句修改depailment表deletefromdepartment

27、wheredept_id=*1012*第.條DELETE語句修改employee表deletefromemployeewheredept_id=*1012*在執(zhí)行第一條DELETE語句后,數(shù)據(jù)庫中的數(shù)據(jù)已處丁不一致的狀態(tài),因為此時已經(jīng)沒尙后勤部了,但employee表中仍然保存著屬丁后勤部的員工記錄。只苗執(zhí)行了第二條DELETE語句后數(shù)據(jù)才重新處丁一致狀態(tài)。但是,如果執(zhí)行完第一條語句后,計算機(jī)突然出現(xiàn)故障,無法再繼續(xù)執(zhí)行第二條DELETE語句,則數(shù)據(jù)庫中的數(shù)據(jù)將處于永遠(yuǎn)不一致的狀態(tài)。因此,必須保證這兩條DELETE語句同時執(zhí)行。為解決類似的問題,數(shù)據(jù)庫系統(tǒng)通常都引入了事務(wù)(Transactio

28、n)的概念。11.4.2事務(wù)的概念事務(wù)是一種機(jī)制,是一個操作序列,它包含了一組數(shù)據(jù)庫操作命令,所何的命令作為一個整體一起向系統(tǒng)提交或撤消操作請求,即要么都執(zhí)行,要么都不執(zhí)行。因此,事務(wù)是一個不可分割的工作邏輯單元,類似于操作系統(tǒng)中的原語。在數(shù)據(jù)庫系統(tǒng)上執(zhí)行并發(fā)操作時,事務(wù)是作為最小的控制單元來使用的。通常在程序中用BEGINTRANSACTION命令來標(biāo)識一個事務(wù)的開始,用COMMITTRANSACTION命令標(biāo)識事務(wù)結(jié)束。這兩個命令Z間的所有語句被視為一體,只有執(zhí)行到COMMITTRANSACTION命令時,事務(wù)中對數(shù)據(jù)庫的更新操作才算確認(rèn)。和BEGIN.END命令類似,這兩個命令也可以進(jìn)行

29、嵌套,即事務(wù)可以嵌套執(zhí)行。這兩個命令的語法如下:BEGINTRANSACTIONtransactionname|trannamevariableCOMMITTRANSACTIONtransactionname|tran_name_variable其中BEGINTRANSACTION町以縮寫為BEGINTRAN.COMMITTRANSACTION可以縮寫為COMMITTRAN或COMMIT。tiansactionjiame指定事務(wù)的名稱。只有前32個字符會被系統(tǒng)識別。tian_name_vanab1e用變最來指定事務(wù)的名稱。變最只能聲明為CHAR、VARCHAR.NCHAR或NVARCHAR類型

30、。例11-17:刪除后勤部。declaretraiisaction_namevarchar(32)selecttraiisaction_name=1my_transaction_delete1begintransactiontransaction_namego/*關(guān)丁命令go的用法請參見第1?章“存儲過程和觸發(fā)器”*/usepangugodelete&omdepartmentwheredept_id=1012*godelete&omemployeewheredept_id=*1012*gocommittransactionmy_transaction_deletego11.4.3事務(wù)回滾事務(wù)回

31、滾(TransactionRollback)是指當(dāng)事務(wù)中的某一語句執(zhí)行失敗時,將對數(shù)據(jù)庫的操作恢復(fù)到事務(wù)執(zhí)行前或某個指定位置。事務(wù)回滾使用ROLLBACKTRANSACTION命令,其語法如卜:ROLLBACKTRANSACTIONtransactionname|tran_name_valiable|savepointname|savepoint_variable其中savepoint_namelisavepoint_vanable參數(shù)用于指定回滾到某一指定位置。如果要讓事務(wù)回滾到指定位置,則需要在事務(wù)中設(shè)定保冇點(SavePoint)。所謂保存點是指定其所在位置Z前的事務(wù)語句不能回滾的語句,

32、即此語句前而的操作被視為有效。其語法如F:SAVETRANSACTIONsavepointname|savepoint_valiable各參數(shù)說明如下:avepoint_name指定保存點的名稱。同事務(wù)的名稱一樣,只有前32個字符會被系統(tǒng)識別。savepoint_vanable用變屋來指定保存點的名稱。變最只能聲明為CHAR、VARCHAR.NCHAR或NVARCHAR類型。例11-18:刪除后勤部,再將后勤部的職工劃歸到經(jīng)理室。begintransactionmy_transaction_deleteusepangugodeletefromdepartmentwheredept_id=*10

33、12*savetransactionafter_deleteupdateemployeesetdept_id=*1001*wheredept_id=*1012*iferror!=0orrowcount=0thenbeginrollbacktranafterdelete/*回滾到保存點afterdelete,如果使用rollbackmy_trailsaction_delete,則會|叫滾到,那務(wù)開始前*/committranprint*更新員工信息表時產(chǎn)生錯誤!returnendcommittransactionmy_transaction_deletego!如果不指定回滾的爭務(wù)名稱或保存點,則

34、ROLLBACKTRANSACTION命令會將事務(wù)回滾到爭務(wù)執(zhí)行前.如果事務(wù)是嵌套的、則會同滾到畏靠近的BEGINTRANSACTION傘令前一11.5鎖11.5.1鎖的概念鎖(Lock)是在多用戶壞境下對資源訪問的一種限制機(jī)制。當(dāng)對一個數(shù)據(jù)源加鎖后,此數(shù)據(jù)源就有了一定的訪問限制。我們就稱對此數(shù)據(jù)源進(jìn)行了“鎖定”。在SQLServer中,可以對以下的対彖進(jìn)行鎖定:數(shù)據(jù)行(Row):數(shù)據(jù)頁中的單行數(shù)據(jù);索引行(Key):索引頁中的單行數(shù)據(jù),即索引的鍵值;頁(Page):頁是SQLServer存取數(shù)據(jù)的基本單位,其大小為8KB;盤區(qū)(Extent):一個盤區(qū)由8個連續(xù)的頁紐成;表(Table);數(shù)

35、據(jù)庫(Database)011.5.2鎖的類別在SQLServer中,鎖有兩種分類方法。從數(shù)據(jù)庫系統(tǒng)的角度來看鎖分為以下三種類型:獨占鎖(ExclusiveLock)獨占鎖鎖定的資源只允許進(jìn)行鎖定操作的程序使用,其它任何対它的操作均不會被接受。執(zhí)行數(shù)據(jù)更新命令,即INSERT、UPDATE或DELETE命令時,SQLServer會自動使用獨占鎖。但當(dāng)對彖上冇其它鎖存在時,無法對其加獨占鎖。獨占鎖一直到事務(wù)結(jié)束才能被釋放。共享鎖(SharedLock)共享鎖鎖定的資源可以被其它用戶讀取,但其它用戶不能修改它。在SELECT命令執(zhí)行時,SQLSeiver通常會対對象進(jìn)行共享鎖鎖定。通常加共享鎖的數(shù)

36、據(jù)頁被讀取完畢后,共享鎖就會立即彼釋放。更新鎖(UpdateLock)更新鎖是為了防止死鎖而設(shè)立的。當(dāng)SQLServer準(zhǔn)備更新數(shù)據(jù)時,它首先對數(shù)據(jù)對彖作更新鎖鎖定,這樣數(shù)據(jù)將不能被修改,但可以讀取。等到SQLServer確定要進(jìn)行更新數(shù)據(jù)操作時,它會自動將更新鎖換為獨占鎖。但當(dāng)對象上有其它鎖存在時,無法刈其作更新鎖鎖定。從程序員的角度看鎖分為以下兩種類型:樂觀鎖(OptimisticLock)樂觀鎖假定在處理數(shù)據(jù)時,不需要在應(yīng)用程序的代碼中做任何事情就可以直接在記錄上加鎖,即完全依靠數(shù)據(jù)庫來管理鎖的工作。一般情況F,當(dāng)執(zhí)行事務(wù)處理時,SQLSeiner會自動對事務(wù)處理范圍內(nèi)更新到的表做鎖定。

37、悲觀鎖(PessimisticLock)悲觀鎖對數(shù)據(jù)庫系統(tǒng)的自動管理不感冒,需要程序員直接管理數(shù)據(jù)或?qū)﹀枭系募渔i處理,并負(fù)責(zé)獲取、共享和放棄正在使用的數(shù)據(jù)上的任何鎖。11.5.3隔離級別隔離(Isolation)是計算機(jī)安全學(xué)中的一種概念,其本質(zhì)上是一種封鎖機(jī)制。它是指自動數(shù)據(jù)處理系統(tǒng)中的用戶和資源的相關(guān)牽制關(guān)系,也就是用戶和進(jìn)程彼此分開,且和操作系統(tǒng)的保護(hù)控制也分開來。在SQLServer中,隔離級(IsolationLevel)是指一個事務(wù)和其它事務(wù)的隔離程度,即指定了數(shù)據(jù)庫如何保護(hù)(鎖定)那些當(dāng)前正在被其它用戶或服務(wù)器請求使用的數(shù)據(jù)。指定事務(wù)的隔離級與在SELECT語句中使用鎖定選項來控

38、制鎖定方式具有相同的效果。在SQLServer中,有以卜四種隔離級:READCOMMITTED在此隔離級匚SELECT命令不會返回尚未提交(Committed)的數(shù)據(jù),也不能返回臟數(shù)據(jù)。它是SQLServer默認(rèn)的隔離級。READUNCOMMITTED與READCOMMITTED隔離級相反,它允許讀取已經(jīng)被其它用戶修改但尚未提交確定的數(shù)據(jù)。REPEATABLEREAD在此隔離級匚用SELECT命令讀取的數(shù)據(jù)在整個命令執(zhí)行過程中不會被更改。此選項會影響系統(tǒng)的效能,非必要情況最好不用此隔離級。SERIALIZABLE與DELETE語句中SERIALIZABLE選項含義相同。隔離級需要使用SET命令

39、來設(shè)定,其語法如|:SETTRANSACTIONISOLATIONLEVELREADCOMMITTED|READUNCOMMITTED|REPEATABLEREAD|SERIALIZABLE11.5.4查看鎖可以通過企業(yè)管理器或存儲過程來查看鎖。1.用EnterpriseManager查看鎖在企業(yè)管理器中,選擇目錄樹窗丨I中Management”文件夾卜CurrentActivity中的“Locks/ProcessID”節(jié)點,則可以查看當(dāng)前鎖定的進(jìn)程;選擇同級的“Locks/Object”節(jié)點下的相應(yīng)字節(jié)點,則可以查看當(dāng)前鎖定的對象,如圖11所示。在圖11-1中,右鍵單擊任務(wù)板窗II中的對象,從快捷菜單中選擇“屬性”選項,則會出現(xiàn)如圖11-2所示的鎖的進(jìn)程細(xì)節(jié)對話框。在此,可以刷新或殺死鎖的進(jìn)程。殺死進(jìn)程還可以用如FTransact-SQL命令來進(jìn)行:KILLspidspid是SystemProcessID,即系統(tǒng)進(jìn)程編號的縮寫,如圖11-1中所示。TaComoleRoV*l*crosotSQtServers.SQlServerGnMipXUJ)r(WindowsNVZOOO)Ui“)emenvC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論