數(shù)據(jù)庫保護技術(shù)_第1頁
數(shù)據(jù)庫保護技術(shù)_第2頁
數(shù)據(jù)庫保護技術(shù)_第3頁
數(shù)據(jù)庫保護技術(shù)_第4頁
數(shù)據(jù)庫保護技術(shù)_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章數(shù)據(jù)庫保護技術(shù)本章內(nèi)容8.1事務1

8.2并發(fā)控制和鎖的管理328.1事務管理8.1.1事務的基本概念8.1.2事務的特性8.1.3SQLServer的事務的模式8.1.4事務的處理語句8.1.5批處理8.1.1事務的基本概念 事務概念是一個數(shù)據(jù)庫動態(tài)特性的核心,是數(shù)據(jù)庫一致性的單位。事務(transaction)是用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全做,要么全不做,是一個不可分割的工作單元。一個事務就是一組程序,完成對數(shù)據(jù)庫的某些一致性操作,事務中的SQL語句必須按邏輯次序執(zhí)行。事務是數(shù)據(jù)庫中的最基本的工作單元,也是數(shù)據(jù)庫恢復和并發(fā)控制的基本單元。事務的應用背景(1)例1:某公司在銀行中有A,B兩個帳號,現(xiàn)在公司想從帳號A中取出1萬元,存入帳號B。那么在A中取出1萬元的操作和在B中增加1萬元的操作要么都成功完成,要么都不做。因此,需要把這二個操作定義在一個事務中。銀行轉(zhuǎn)帳:事務T從A帳戶過戶1¥到B帳戶。

T: read(A); A:=A–1; write(A); read(B); B:=B+1; write(B);read(X):從數(shù)據(jù)庫傳送數(shù)據(jù)項X到事務的工作區(qū)中。write(X):從事務的工作區(qū)中將數(shù)據(jù)項X寫回數(shù)據(jù)庫。例2:考慮飛機訂票系統(tǒng)中的一個活動序列:(1)甲售票點讀出某航班的機票余額=16;(2)乙售票點讀出同一航班的機票余額也為16;(3)甲售票點賣出一張機票,修改余額為15,并把A寫回數(shù)據(jù)庫;(4)乙售票點也賣出一張機票,也修改余額為15,并把A寫回數(shù)據(jù)庫。甲: read(A);乙: read(A);甲: A:=A–1;乙: A:=A–1;甲: write(A);乙: write(A);

結(jié)果賣出了兩張票,數(shù)據(jù)庫中機票余額只減少1。因此,要把甲乙售票點的操作放在兩個事務中,一個執(zhí)行完了才能執(zhí)行另一個。事務的應用背景(2)8.1.2事務的特性(1)事務具有四個特性:原子性(Atomicity)、一致性(Consistency)、分離性(Isolation)、持久性(Durability)。這四個特性也簡稱為ACID特性。8.1.2事務的特性(2)(1)原子性(Atomicity)

事務的原子性指的是,事務中包含的程序作為數(shù)據(jù)庫的邏輯工作單位,它所做的對數(shù)據(jù)修改操作要么全部執(zhí)行,要么完全不執(zhí)行。這種特性稱為原子性。(2)一致性(Consistency)

事務的一致性指的是,在一個事務執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫都必須處于一致性狀態(tài)。這種特性稱為事務的一致性。假如數(shù)據(jù)庫的狀態(tài)滿足所有的完整性約束,就說該數(shù)據(jù)庫是一致的。8.1.2事務的特性(3)(3)分離性(Isolation)

分離性指并發(fā)的事務是相互隔離的。即一個事務內(nèi)部的操作及正在操作的數(shù)據(jù)必須封鎖起來,不被其它企圖進行修改的事務看到。

分離性是DBMS針對并發(fā)事務間的沖突提供的安全保證,通過并發(fā)控制機制實現(xiàn)。DBMS可以通過加鎖在并發(fā)執(zhí)行的事務間提供不同級別的分離。

對任何一對事務T1,T2,在T1看來,T2要么在T1開始之前已經(jīng)結(jié)束,要么在T1完成之后再開始執(zhí)行。8.1.2事務的特性(4)(4)持久性(Durability)

持久性意味著當系統(tǒng)或介質(zhì)發(fā)生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數(shù)據(jù)庫中數(shù)據(jù)的改變應該是永久性的,耐得住任何系統(tǒng)故障。

DBMS保證采取措施:

系統(tǒng)發(fā)生故障不能改變事務的持久性。持久性通過事務日志、數(shù)據(jù)庫備份和恢復來保證。8.1.3SQLServer的事務模式SQLServer的事務模式可分為三種:顯式事務、隱式事務、自動事務模式。顯式事務:

是指由用戶執(zhí)行T-SQL事務語句而定義的事務。SQL語言中事務的定義:

事務以Begintransaction開始,以Committransaction或Rollbacktransaction結(jié)束。Committransaction表示事務正常結(jié)束,可以提交。

Rollbacktransaction表示事務非正常結(jié)束,撤消事務已做的操作,回滾到事務開始時狀態(tài)。

在SQLServer中,用SETIMPLICITY_TRANSACTIONSON和SETIMPLICITY_TRANSACTIONSOFF語句來進入隱式事務連接模式和退出隱式事務連接模式。

隱式事務不需要使用BEGINTRANSACTION語句標識事務的開始,但需要有事務結(jié)束語句COMMITTRANSACTION(或COMMITWORK)標識事務的結(jié)束。在隱式事務模式下,某些SQL語句(例CREATETABLE,DROPTABLE語句等)被執(zhí)行后,馬上導致提交操作,結(jié)束當前事務。隱式事務:

自動事務是SQLServer的默認事務管理模式。在自動事務模式下,當一個語句成功執(zhí)行后,它被自動提交,而當它執(zhí)行過程中產(chǎn)生錯誤時,則被自動回滾。當應用程序與SQLServer建立連接后,直接進入自動事務模式,直到使用BEGINTRANSACTION語句開始一個顯式事務,或者打開IMPLICIT_TRANSACTIONS

連接選項進入隱式事務模式為止。當顯式事務被提交或回滾,或者關(guān)閉IMPLICIT_TRANSACTIONS連接選項后,SQLServer又進入自動事務管理模式。自動事務模式:8.1.4事務處理語句

SQLServer中有關(guān)事務處理的語句包括:

BEGINTRANSACTION

:建立一個顯式事務。

COMMITTRANSACTION

:標識一個顯式事務或隱式事務正常結(jié)束而提交。

SAVETRANSACTION

:在事務內(nèi)定義一個存儲點標記。

ROLLBACKTRANSACTION

:回滾事務。(1)定義和提交事務BEGINTRANSACTION和COMMITTRANSACTION的語句格式:BEGINTRANSACTION[事務名稱] {SQL語句}COMMITTRANSACTION①哪些SQL語句組成一個事務由用戶根據(jù)情況而定。②定義一個事務時,BEGINTRANSACTION語句與COMMITTRANSACTION語句必須成對出現(xiàn)。ROLLBACKTRANSACTION:回滾事務,消除事務執(zhí)行的影響。在一個事務被提交之前可以使用ROLLBACKTRANSACTION回滾,一旦提交就不能撤銷。語句格式:ROLLBACKTRANSACTION[事務名稱|存儲點名稱]該語句回滾整個事務或是存儲點定義以后所發(fā)生的事務。

ROLLBACKTRANSACTION語句應在COMMITTRANSACTION語句之前調(diào)用。(2)回滾事務(3)定義存儲點標記SAVETRANSACTION:在事務內(nèi)建立一個存儲點標記。ROLLBACKTRANSACTION語句可使用該標記來回滾部分事務操作。SAVETRANSACTION語句的格式為:

SAVETRANSACTION存儲點名稱(4)定義、提交和回滾事務示例下面例子說明怎樣建立一個用戶定義事務及事務中的存儲點、回滾操作和事務提交操作。

BEGINTRANSACTIONdemoSELECT*FROMdiscounts

SAVETRANSACTION

save_demo/存儲點/INSERTdiscountsVALUES(‘demo’,null,null,null,20.0)SELECT*FROMdiscounts

ROLLBACKTRANSACTION

save_demo/回滾/COMMITTRANSACTIONSELECT*FROMdiscounts/結(jié)果沒有變化/

在SQLServer中,允許定義嵌套事務,但只有最外層的BEGINTRANSACTION語句和COMMITTRANSACTION語句才能建立和提交事務,在回滾事務時,也只能使用最外層定義的事務名或存儲點標記,而不能使用內(nèi)層定義的事務名。 事務嵌套常用在存儲過程或觸發(fā)器內(nèi),它們可以使用BEGINTRANSCATION

……COMMITTRANSACTION對來相互調(diào)用。(5)事務嵌套(6)事務狀態(tài)的變化0活動狀態(tài)2失敗狀態(tài)1部分可提交狀態(tài),部分語句沒執(zhí)行3提交狀態(tài)4回滾狀態(tài)初始狀態(tài)事務無法繼續(xù)正常執(zhí)行事務回滾,數(shù)據(jù)庫恢復到事務開始前狀態(tài)執(zhí)行最后一條語句成功完成,永久寫入數(shù)據(jù)庫圖7-6事務狀態(tài)的變化5結(jié)束狀態(tài)8.1.5批處理批是一組SQL語句的集合,一個批以批處理結(jié)束符號GO結(jié)束。批中語句被一次提交給SQLServer,SQLServer將這些語句編譯為一個執(zhí)行單元,稱做SQLServer執(zhí)行計劃。GO不是SQL語句。它是在某些客戶端工具中使用的符號,客戶端工具將它解釋為:最后一個GO上面的所有內(nèi)容都應該一起發(fā)送到服務器來執(zhí)行。例:右邊例子中的注釋符號并沒有起到預先的目的。原因:客戶端工具并沒有解釋任何SQL語句,它只是將語句分解成多個批處理。SQLServer批處理的示例(1)SELECT*FROMauthors/*GOSELECT*FROMsalesGOSELECT*FROMpublishersGO*/SELECT*FROMtitlesGO

如果在一個包含批處理結(jié)束的GO命令T-SQL語句集合中,想注釋一些語句,那么應該在每個GO的前面使用另外一種注釋標記符:兩個短劃線(也可以用其它字符代替兩個短劃線)。上例中的應改為:SELECT*FROMauthors/*--GOSELECT*FROMsales--GOSELECT*FROMpublishers--GO*/SELECT*FROMtitlesGOSQLServer批處理的示例(2)

在執(zhí)行批時,如果其中任一個T-SQL語句存在語法錯誤,SQLServer將取消批中所有語句的執(zhí)行。例1:SELECT*FROMsalesSELECT*FRO

titleauthorGO

在上例中,第一個語句是正確的,第二個語句存在語法錯誤,但由于這兩個語句是在一個批中,第一個語句不會被執(zhí)行,執(zhí)行這個批的結(jié)果是返回一個錯誤信息。SQLServer批處理的示例(3)建立批時應注意的事項CREATEVIEW、CREATERULE、CREATEDEFAULT、CREATETRIGGER、CREATEPROCEDURE 語句應在批中單獨提交,它們不能與其它T-SQL語句一起構(gòu)成一個批。(2)使用ALTERTABLE語句修改表結(jié)構(gòu)后,不能在同一個批中參照新定義列。(3)EXECUTE(或EXEC)語句為批中第一個語句時,EXECUTE(或EXEC)關(guān)鍵字可以省略。否則,必須使用該關(guān)鍵字。批和事務的區(qū)別批是一個客戶端的基本概念,它控制多個語句如何發(fā)送到SQLServer以便立即處理。而事務是一個服務器端的概念,是SQLServer執(zhí)行T-SQL語句的基本工作單元。批語句的組合發(fā)生在編譯時刻,而事務中語句的組合發(fā)生在執(zhí)行時刻。當在編譯時,如果批中某個語句存在語法錯誤,SQLServer將取消這個批中所有語句的執(zhí)行。在執(zhí)行時刻,如果事務中某個數(shù)據(jù)修改操作違犯約束、規(guī)則、觸發(fā)器等條件時,SQLServer將回滾整個事務。在一個批中可以包含多個事務,在一個事務中也可以包含多個批。一個事務中包含批的示例例1:下面的例子是一個事務,它由四個批處理組成:BEGINTRANINSERTauthorsVALUES(...)GOSELECT*FROMauthorsGOUPDATEpublishersSETpub_id=(...)GOSELECT*FROMpublishersGOCOMMITTRAN一個批中包含多個事務示例例2:下面的例子是一個批處理,它由兩個事務組成:BEGINTRANINSERTauthorsVALUES(...)SELECT*FROMauthorsCOMMITTRANBEGINTRAN

UPDATEpublishersSETpub_id=...INSERTpublishersVALUES(...)COMMITTRANGO8.2并發(fā)控制和鎖的管理8.2.1并發(fā)控制8.2.2鎖的管理8.2.1并發(fā)控制數(shù)據(jù)庫是一個共享資源,可供多個用戶使用。允許多個用戶同時使用的數(shù)據(jù)庫系統(tǒng)稱為多用戶數(shù)據(jù)庫系統(tǒng)。例如:銀行數(shù)據(jù)庫系統(tǒng)、機票訂票數(shù)據(jù)庫系統(tǒng)等。當多個用戶并發(fā)地存取數(shù)據(jù)庫數(shù)據(jù)時,就可能會產(chǎn)生多個事務同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制,就可能會導致讀和寫不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。并發(fā)控制的核心問題是在保證數(shù)據(jù)庫一致性的前提下最大限度地提高并發(fā)度。并發(fā)所引起的問題事務如果不加控制地并發(fā)執(zhí)行,會產(chǎn)生下列三個問題:丟失更新(lostupdate)讀臟數(shù)據(jù)

(dirtyread)讀值不可復現(xiàn)(unrepeatableread)丟失更新右圖是事務T1和T2并發(fā)執(zhí)行的情況。如果x的初始值為5,則x的結(jié)果值為15。即T1對x的更新被丟失。T1T2read(x)read(x)x:=x+1write(x)x:=3xwrite(x)時間把X由5增加1變?yōu)?把X由5乘3變?yōu)?5初始值X=5

丟失更新問題是由于兩個事務對同一數(shù)據(jù)并發(fā)寫入所引起的,這稱為“寫-寫沖突”。讀臟數(shù)據(jù)(1)

右圖中,T1對某元組t的兩個屬性x,y進行更新,T2并發(fā)地讀取t[x],t[y],x在更新前讀,y在更新后讀,這樣所讀得的值既不反映t更新前的狀態(tài),也不反映t更新后的狀態(tài),是不一致的數(shù)據(jù)。T1T2read(x)write(t)時間read(y)(rollback)更新t[x]更新t[y]讀更新后的t[y]讀更新前的t[x]可能會讀到臟數(shù)據(jù)的另一種情況:當T2計算某種聚集函數(shù)(例如AVG)時,要用到多個元組的某一屬性值(例如工資),如果T1并發(fā)地修改工資值,則T2在計算平均工資時,有些可能是修改前的工資值,有些可能是修改后的工資值,這也是一種不一致性。讀臟數(shù)據(jù)問題是由于一個事務讀另一個更新事務尚未提交的數(shù)據(jù)所引起的,這稱為“讀-寫沖突”。讀臟數(shù)據(jù)(2)讀值不可復現(xiàn)(1)

在右圖中,T1兩次讀x,本來T1兩次讀出的x應該是一樣的,但如果在兩次讀之間,另一個與T1并發(fā)執(zhí)行的事務T2修改了x,則T1兩次讀出的x可能就不同。讀值不可復現(xiàn)也是由“讀-寫沖突”所引起的。T1T2read(x)write(x)時間read(x)更新X值讀更新前的X值讀更新后的X值并發(fā)控制的任務就是避免訪問沖突所引起的數(shù)據(jù)不一致。數(shù)據(jù)庫管理系統(tǒng)一般都提供并發(fā)控制機制。即采用對資源加鎖的方法控制用戶并發(fā)操作。讀值不可復現(xiàn)(2)8.2.2鎖的管理

為了避免并發(fā)事務引起操作的沖突,DBMS提供了對數(shù)據(jù)進行封鎖的管理機制。1.加鎖和解鎖加鎖(LOCK):當一個事務訪問數(shù)據(jù)庫中的某個數(shù)據(jù)單元時,要先對被訪問的數(shù)據(jù)單元加鎖。假如要訪問的數(shù)據(jù)單元還沒有設(shè)置其他鎖,該事務就獲得訪問權(quán),否則,該事務必須等待直到釋放其他的鎖。解鎖(UNLOCK):進程訪問結(jié)束釋放鎖。1.兩種基本的鎖類型

通常設(shè)置的兩種基本類型的鎖:

共享鎖(S鎖,Sharedlock):只用于并發(fā)的只讀數(shù)據(jù)操作。任何試圖修改某數(shù)據(jù)的事務,如果該數(shù)據(jù)上有共享鎖,那么該事務就會被阻塞,直到所有的共享鎖被釋放。

獨占鎖(X鎖,eXclusivelock)

:任何寫操作均要使用獨占鎖。獨占鎖被授予已經(jīng)準備好進行數(shù)據(jù)修改的事務,確保其它事務不能訪問該獨占鎖鎖定的數(shù)據(jù)。圖8-4兩種鎖的相容矩陣T1T2獨占鎖

共享鎖

—獨占鎖共享鎖

—NONOYESNOYESYESYESYESYESYES=相容的請求,NO=不相容的請求2.兩段式鎖協(xié)議

所謂"兩段式協(xié)議"名字的來源出于如下事實:

一個進程分為兩個階段,在第一個階段,該進程放置的鎖的數(shù)目穩(wěn)定的增長,全是加鎖;

第二個階段只能釋放鎖,而且是一起釋放。必須遵守的兩段式協(xié)議的內(nèi)容:(1)一個數(shù)據(jù)單元在第一次被訪問之前必須對它加鎖。(2)如果一個數(shù)據(jù)單元已經(jīng)有了一個共享鎖,只能對它再附加共享鎖。假如它有了一個獨占鎖,不能再對它附加任何鎖。(3)由一個進程設(shè)置的所有鎖,只能在該進程結(jié)束時釋放,而且要一起釋放。

DBMS通過攔截從事務來的操作滿足第一條。第三條在事務結(jié)束時實現(xiàn)。3.封鎖策略(1)

DBMS封鎖數(shù)據(jù)單元的策略有如下幾種:(1)封鎖一個數(shù)據(jù)單元意味著封鎖了它的所有后代單元。這種策略實現(xiàn)起來很困難。因為一個單元的后代單元可能又是其他單元的后代,因此,在封鎖該數(shù)據(jù)單元的同時要找出它的所有后代單元,同時給予加鎖。釋放時要同時釋放。3.封鎖策略(1)(2)封鎖一個數(shù)據(jù)單元,只封鎖該單元本身,并不涉及它的后代。這種方法實現(xiàn)簡單,但要采用一些其他手段保證數(shù)據(jù)的完整性。例如,當某數(shù)據(jù)單元是其他多個數(shù)據(jù)單元的組成部分時,容易引起沖突。3.封鎖策略(2)(3)關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,采用分層封鎖策略,即封鎖了上層節(jié)點就意味著封鎖了所有內(nèi)層節(jié)點。 例如,如果有事務T1已經(jīng)對關(guān)系R中的某元組加了S鎖,而事務T2要對該元組所在的關(guān)系R加X鎖,因而隱含地需要用X鎖封鎖該元組,這兩個事務就會產(chǎn)生矛盾。

4.封鎖的粒度(1) 數(shù)據(jù)庫中某獨立部分數(shù)據(jù)稱為一個數(shù)據(jù)單元,關(guān)系數(shù)據(jù)庫中,一個數(shù)據(jù)單元小到可以是一個數(shù)據(jù)項、一個元組、一個關(guān)系,大到一個存儲域,直至一個數(shù)據(jù)庫。封鎖單元的大小稱為封鎖粒度(Granularity)。4.封鎖的粒度(1)

封鎖的單元可以是邏輯單元,也可以是物理單元。關(guān)系數(shù)據(jù)庫中的邏輯單元為:屬性值、元組、關(guān)系、某索引項、整個索引、直至整個數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫中的物理單元為:頁(數(shù)據(jù)頁或索引頁)和存儲區(qū)。4.封鎖的粒度(2)

封鎖的粒度、系統(tǒng)的并發(fā)度和并發(fā)控制的開銷密切相關(guān)。封鎖的粒度越大,數(shù)據(jù)庫所能夠封鎖的數(shù)據(jù)單元就越少,并發(fā)度越小,系統(tǒng)開銷也越小,并行度也就越低。

反之,封鎖粒度越小,并行度越高,系統(tǒng)管理鎖的開銷也越大,實現(xiàn)起來也更加困難。因此,在封鎖單元的大小、并行度和管理鎖的開銷之間要進行權(quán)衡。

4.封鎖的粒度(2)從用戶的角度看,如果在一個系統(tǒng)中同時支持多種封鎖粒度供不同的事務選擇是比較理想的,這種封鎖方法稱為多粒度封鎖(MultipleGranularityLocking)。多粒度鎖數(shù)據(jù)庫DB...…

圖8-5分層多粒度樹關(guān)系Rn關(guān)系R1元組m元組1屬性k屬性1...5死鎖一個事務如果申請鎖而未獲準,則須等待其他事務釋放鎖。這就形成了事務間的等待關(guān)系。當事務中出現(xiàn)循環(huán)等待時,如果不加干預,則會一直等待下去,即出現(xiàn)死鎖現(xiàn)象。

死鎖發(fā)生時,至少有兩個或多個事務同時處于等待狀態(tài),每個事務都在等待其他事務釋放鎖才可繼續(xù)執(zhí)行。事務相互等待示例R2R1R3T1已占有資源T3已占有資源T2已占有資源圖8-7(2)死鎖的解決辦法解決死鎖一般采用兩個方法:死鎖的預防死鎖的檢測與解除(3)死鎖的預防預防死鎖的方法較多,如:(1)一次封鎖法:一次封鎖法要求每個事務必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行。(3)死鎖的預防(2)順序封鎖法:順序封鎖法是預先對數(shù)據(jù)對象規(guī)定一個封鎖順序,所有事務都按這個順序?qū)崿F(xiàn)封鎖。例如,在圖8-7中,如果封鎖的次序都是R1-R2,就不會出現(xiàn)死鎖,因為在T1沒有結(jié)束之前,T2不可能開始。(4)死鎖的檢測與解除(1)如果允許數(shù)據(jù)庫中出現(xiàn)死鎖,應盡可能及時發(fā)現(xiàn)和處理,死鎖的檢測一般使用超時法或等待圖法。(1)超時法:如果一個事務的等待時間超過了規(guī)定的時限,則認為發(fā)生了死鎖。(4)死鎖的檢測與解除(1)(2)等待圖法:事務等待圖是一個有向圖G=(T,U),T為結(jié)點的集合,每個結(jié)點表示正運行的事務;U為邊的集合,每條邊表示事務等待的情況。若T1等待T2,則T1,T2之間有一條有向邊,從T1指向T2。如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。發(fā)現(xiàn)死鎖后,靠事務本身無法打破死鎖,必須由DBMS干預。DBMS對死鎖

溫馨提示

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

評論

0/150

提交評論