《数据库保护》PPT课件.ppt_第1页
《数据库保护》PPT课件.ppt_第2页
《数据库保护》PPT课件.ppt_第3页
《数据库保护》PPT课件.ppt_第4页
《数据库保护》PPT课件.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章 数据库保护,1. 事务 2.并发控制 3.数据库恢复,8.1.1 为什么要使用事务,事务是保护数据库的一致性和完整性的重要机制。 由于数据的共享,可能会出现并发操作的现象,即多个用户在同一时刻访问和修改同一数据库中的同一部分数据。 并发操作会产生一系列问题,比如出现由于一个用户对某个数据的操作导致其他用户使用的数据成为无效数据的现象。使用事务可以确保同时发生的行为不会发生冲突,不会影响数据的有效性。 举例 买最后一张机票 一次网上交易,8.1.2 事务的概念,概念 事务是一种机制,是一段程序,是一系列的数据库操作构成的集合,在逻辑上是一个不可分割的工作单元。不管系统中有多少故障出现,不管有多少并发操作,事务中的操作作为一个整体,要么所有的操作都成功执行,要么一个也不执行。,图8-1 事务的执行方式,8.1.3 事务的特性,事务有四个特性: 原子性:事务是一个工作单元,作为一个整体要么都做,要么都不做。 一致性 :事务在完成时,必须使数据库内所有的数据都保持一致性状态。 隔离性 :一个事务的执行不能被其他的事务所干扰。 持续性 :事务一旦提交,它对数据库的改变就是永久的。,8.1.4 在SQL Server中实现事务管理,1. 事务运行的三种模式,1)显式事务,BEGIN TRANSACTION:事务开始的标记。,显示事务由用户自定义,每个事务均以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK语句结束。,COMMIT:提交事务,标识事务成功执行。,ROLLBACK:标识一个非正常事务结束,说明执行过程中遇到错误,事务内所修改的数据被恢复到事务执行前的状态。,8.1.4 在SQL Server中实现事务管理,2)隐式事务,在隐式事务模式下,当前事务提交或回滚后,SQL Server自动开始下一个事务。,SET IMPLICIT_TRANSACTIONS ON -进入隐式事务模式,SET IMPLICIT_TRANSACTIONS OFF -关闭隐式事务模式,可以使SQL Server重新启动一个事务的语句,隐式事务模式的启动和关闭,表8-1 使SQL Server重新启动事务的语句,8.1.4 在SQL Server中实现事务管理,例:TRUNCATE TABLE语句可以让用户删除指定表中的所有数据。由TRUNCATE TABLE删除的表数据后,不能使用ROLLBACK撤销。,下面两段程序的执行结果有何不同?,USE TSG GO SET IMPLICIT_TRANSACTIONS ON GO TRUNCATE table Book ROLLBACK GO SET IMPLICIT_TRANSACTIONS OFF,USE TSG GO SET IMPLICIT_TRANSACTIONS ON GO DELETE FROM Book ROLLBACK GO SET IMPLICIT_TRANSACTIONS OFF,8.1.4 在SQL Server中实现事务管理,3)自动提交事务,使用BEGIN TRANSACTION语句开始一个显示事务,自动提交事务是SQL Server的默认事务管理模式。将每条单独的T-SQL语句视为一个事务。,使用SET语句进入隐式事务模式,自动提交事务模式的终止,8.1.4 在SQL Server中实现事务管理,2. 使用T-SQL实现事务,表8-2 事务语句,SQL Server中进行事务处理的语句,8.1.4 在SQL Server中实现事务管理,1)BEGIN TRANSACTION,语法格式:,BEGIN TRAN|TRANSACTIONtransaction_name| tran_name_variable,transaction_name:事务名称; tran_name_variable:用户定义的、含有有效事务名称的 变量的名称。,2)SAVE TRANSACTION,语法格式:,SAVE TRAN|TRANSACTIONsavepoint_name| savepoint_variable,savepoint_name:为分配给保存点的名称 savepoint_variabl:是包含有效保存点名称的用户定义变量 的名称。,8.1.4 在SQL Server中实现事务管理,3)ROLLBACK,ROLLBACK TRAN|TRANSACTION savepoint_name| transaction_name,取消事务中的所做的一些或全部修改,释放事务占用的资源。语法格式:,4)COMMIT,COMMIT TRAN|TRANSACTION,如果事务成功,则提交。语法格式:,【例8-1】 在TSG数据库中将读者的读者证号(PatronID)由“T0202”修改为“T0202A”。,USE TSG GO BEGIN TRAN SELECT * INTO templend FROM Lend WHERE PatronID=T0202 UPDATE templend SET PatronID=T0202A DELETE FROM Lend WHERE PatronID=T0202 UPDATE Patron SET PatronID=T0202A WHERE PatronID=T0202 INSERT INTO Lend SELECT * FROM TEMPLEND DROP TABLE templend COMMIT TRAN SELECT * FROM Patron WHERE PatronID=T0202A GO SELECT * FROM Lend WHERE PatronID=T0202A,图8-2 例8-1的运行结果,8.1.4 在SQL Server中实现事务管理,【例8-2】一个保存点的例子。,USE TSG GO BEGIN TRAN INSERT INTO Book(CallNo,Title,Author,Publisher,ISBN) VALUES(1AAA,DB,GROUP,Tsinghua,978-0303) SAVE TRANSACTION FirstOne INSERT INTO Book(CallNo, Title, Author) VALUES(2AAA, DBT, GROUP) SELECT TIMES=1, * FROM Book WHERE Author=GROUP GO ROLLBACK TRANSACTION FirstOne SELECT TIMES=2,* FROM Book WHERE Author=GROUP GO ROLLBACK TRAN SELECT TIMES=3,* FROM Book WHERE Author=GROUP,8.1.4 在SQL Server中实现事务管理,图8-3 例8-2的运行结果,8.2 并发控制,并发的概念 多个用户或应用程序可以同时对数据库进行访问。这种多用户数据库系统同一时刻可能有多个事务在运行,这就是事务的并发性。 并发操作控制不当可能会破坏数据库的一致性。 并发控制机制是衡量一个DBMS的重要性能指标之一。,8.2.1 事务调度,调度 系统为一个或多个事务的各操作按照时间顺序安排的一个执行序列。 合法调度 (1)调度必须包含所有事务的指令。 (2)同一个事务中的指令的执行顺序在调度中保持不变。,8.2.1 事务调度,1. 事务调度的基本形式 串行调度 事务的操作没有交叉,称为串行调度。 并行调度 DBMS同时接受多个事务运行,并且在同一时间这些事务可以同时运行,称为并行调度。 2. 并发方式 交叉并发 单处理机系统中,事务的操作轮流交叉运行的方式。 同时并发 多处理机系统中,事务的操作可以同时在不同的处理机上运行,实现多个事务的真正并行。,8.2.2 并发操作可能产生的问题,并发操作可能导致的问题:,丢失修改,读“脏”数据,不可重复读,8.2.2 并发操作可能产生的问题,1. 丢失修改,两个事务读入同一数据并修改,某一事务提交的结果破坏了另一事务的结果导致其修改丢失。,设某数据库中有一数据V=100,A、B两个事务分别对V执行加10(V=V-10)和减10操作(V=V + 10 )。,图8-4 修改丢失,8.2.2 并发操作可能产生的问题,2读“脏”数据,某个事务读取了另一个事务正在修改的数据的中间结果,造成该事务读到的数据就与数据库中的数据不一致。,设某数据库中有一数据V=100,A、B两个事务分别对V执行加10(V=V-10)和减10操作(V=V + 10 )。,图8-5 读“脏”数据,8.2.2 并发操作可能产生的问题,3不可重复读,某一事务读取数据后,而另一事务执行更新操作,使前一事务无法再现前一次读取结果。三种情况:,(1)事务A、B并发操作时,B对A使用的数据进行了修改 。,图8-6 不可重复读,(2)A、B并发操作时,B对A使用的数据进行了删除。,(3)A、B并发操作时,B插入的数据对A产生了影响。,8.2.3 封锁,1. 什么是封锁 事务T在对某个数据对象进行操作之前,先向系统发出加锁请求,加锁后事务T就对该数据对象有了一定的控制权,在T释放该锁之前,其他事务不能更新该数据对象。 封锁机制的三个环节 (1)加锁申请 (2)获得锁 (3)释放锁,8.2.3 封锁,2. 封锁类型,1)共享锁(又称读锁),2)排它锁(又称写锁),如果事务T对数据对象A加上共享锁(S锁),其他事务对A只能再加S锁,不能加X锁,直到事务T释放A上的S锁为止。,如果事务T对数据对象A加上排它锁(X锁),则只允许T读取和修改A,其他任何事务既不能读取和修改A,也不能再对A加任何类型的锁,直到T释放A上的锁为止。,表8-3 S锁和X锁的相容矩阵,8.2.4 封锁协议,对数据对象加锁时,需要约定一些规则,这些规则称为封锁协议(Locking Protocol)。,1一级封锁协议,事务T在修改数据之前必须先对其加X锁,直到事务结束才释放。,图8-7 示例(a),可以防止丢失修改的问题,为什么?,8.2.4 封锁协议,2二级封锁协议,事务T对要修改数据必须先加X锁,直到事务结束才释放X锁;对要读取的数据必须先加S锁,读完后即可释放S锁。,图8-7 示例(b),可以防止丢失修改、读“脏”数据。为什么?,8.2.4 封锁协议,3三级封锁协议,事务T在读取数据之前必须先对其加S锁,在要修改数据之前必须先对其加X锁,直到事务结束后才释放所持有的锁。,图8-7 示例(c),可以防止丢失修改、读“脏”数据、不可重复读。为什么?,8.2.5 活锁和死锁,1. 活锁,当多个事务请求封锁同一数据时,某一事务总是处于等待状态无法获得所需封锁,这种状况就称为活锁。,如何来避免活锁的发生?,可采用先来先服务的策略。,8.2.5 活锁和死锁,2. 死锁,事务T1和T2都需要锁定被对方已经锁定的数据对象,提出申请后互相等待对方释放锁,两个事务永远无法结束,只能继续等待。,1)预防死锁,(1)一次封锁法。,(2)顺序封锁法。,2)检测并解除死锁,(1)超时法。,(2)等待图法。,解除死锁的方法 通常是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务得以继续运行下去。,8.2.6 可串行化与两段锁协议,1可串行化,多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。称这种调度策略为可串行化的调度。 可串行性(Serializability)是并发事务正确性的准则。,2两段锁协议,所有事务必须分两个阶段对数据项加锁和解锁:第一阶段是扩展阶段、第二阶段是收缩阶段。,2)收缩阶段:释放封锁,不能再申请任何锁。,1)扩展阶段:获得封锁,不能释放任何锁。,*两段锁协议不一定能预防死锁发生。,8.2.6 可串行化与两段锁协议,图8-8 两段锁协议示例,8.2.7 封锁的粒度,封锁粒度是指封锁对象的大小。 封锁对象可以是逻辑单元,例如属性、元组、关系、甚至整个数据库;也可以是物理单元,例如页(数据页或索引页)、块等。 封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越小,并发度越高,系统开销也越大;封锁的粒度越大,并发度越低,系统开销也越小。 系统中同时支持多种封锁粒度供不同的事务选择,称为多粒度封锁 。,8.2.7 封锁的粒度,1. 多粒度封锁,多粒度树:其根结点是整个数据库,表示最大的封锁粒度。叶结点表示最小的封锁粒度。,一个数据对象可能以两种方式封锁:,1)显式封锁:是应事务的要求直接加到数据对象上的封锁。,图 8-9 三级粒度树,2)隐式封锁:该数据对象是由于其上级结点加锁而使该数据对象加上了锁。,一般来说,对某个数据对象(结点)加锁时,要做到以下几点: (1)检查该数据对象上有无显式封锁与之冲突; (2)还要检查其所有上级结点,看本事务的显式封锁是否与该数据对象上的隐式封锁(由于其上级结点被加锁而获得的)冲突; (3)还要检查其所有下级结点,看上面的显式封锁是否与本事务的隐式封锁冲突。,8.2.7 封锁的粒度,2. 意向锁,对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任何结点加锁时,必须先对它的上层结点加意向锁。,三种常用的意向锁:,1)IS锁:表示对它的后裔结点拟加S锁。,2)IX锁:表示对它的后裔结点拟加X锁。,3)SIX锁:对该数据对象及其所有后裔结点加S锁的同时,对该数据对象再加一个IX锁。,8.2.7 封锁的粒度,锁的相容矩阵:,表8-4 数据锁的相容矩阵,8.2.8 SQL Server的并发控制,1. 隔离级别,事务准备接受不一致数据的级别称为隔离级别(Isolation Level)。,SQL Server 2008所支持的隔离级别:,1)ANSI定义的隔离级别,(1)未提交读,(2)已提交读,(3)可重复读,(4)可串行读,2)行版本控制读取事务隔离级别,(1)已提交读快照,(2)快照,8.2.8 SQL Server的并发控制,2. 设置隔离级别,SQL Server提供的设置隔离级别的T-SQL语句语法格式:,SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED -未提交读 |READ COMMITTED -已提交读 |REPEATABLE READ -可重复读 |SNAPSHOT -快照 |SERIALIZABLE -可串行读 ,【例8-3】将事务的隔离级别设置为可重复读,以使在查看书名为“谋生记”的时候,防止其他事务修改该书的信息。,USE TSG GO SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRAN SELECT * FROM Book WHERE Title=谋生记,8.2.8 SQL Server的并发控制,【例8-4】对于TSG数据库将事务的隔离级别设置为快照,并激活。,USE master GO ALTER DATABASE TSG SET ALLOW_SNAPSHOT_ISOLATION ON USE TSG SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN ,8.2.8 SQL Server的并发控制,3. SQL Server封锁粒度,1)RID和键(KEY),2)页(PAGE),3)簇(EXTENT),4)表(TABLE),5)数据库(DATABASE),8.2.8 SQL Server的并发控制,4. SQL Server的锁定模式,1)更新(U)锁:更新(U)锁要求每次只有一个事务可以获得数据对象上的U锁。如果事务修改数据,则U锁转换为X锁,否则转换为S锁。,2)架构锁:在使用表的数据定义语言(DDL)操作(例如添加列或删除表)时使用。,3)大容量更新(BU)锁:数据大容量复制到表的时候使用。,4)键范围锁:隐式保护该记录集中包含的行范围,防止幻影读。,8.2.8 SQL Server的并发控制,5. 在SQL Server中设置并查看锁,1)使用T-SQL设置锁,SELECT语句中手工加锁的命令为: SELECT * FROM TABLE WHITH(锁的类型),其中锁的类型包括:HOLDLOCK、NOLOCK、PAGLOCK、READCOMMITTED、READPAST、READUNCOMMITTED、REPEATABLEREAD、ROWLOCK、SERIALIZABLE、TABLOCK、TABLOCKX、UPDLOCK。,8.2.8 SQL Server的并发控制,【例8-5】对Book表使用HOLDLOCK设置共享锁。建立两个连接,在两个连接中同时执行下面两段程序。,USE TSG GO BEGIN TRAN T1 SELECT * FROM Book WITH(HOLDLOCK) WHERE CallNo=F121/L612 WAITFOR DELAY 00:00:30 -等待30秒 COMMIT TRAN -提交并释放锁,USE TSG GO BEGIN TRAN T2 SELECT CallNo, Title FROM Book WHERE CallNo =F121/L612 UPDATE Book SET CallNo =10001 WHERE CallNo =F121/L612 COMMIT TRAN,8.2.8 SQL Server的并发控制,【例8-6】对Book表使用TABLOCKX设置排它锁建立两个连接,在两个连接中同时执行下面两段程序。,USE TSG GO BEGIN TRAN T1 INSERT INTO Book WITH(TABLOCK)(CallNo, Title) VALUES(10001,1) WAITFOR DELAY 00:00:30 -等待30秒,USE TSG GO BEGIN TRAN T2 SELECT * FROM Book COMMIT TRAN,8.2.8 SQL Server的并发控制,2)查看锁,【例8-7】编写事务程序,在TSG数据库中将索书号为“F121/L612”的图书页数修改为316。将执行该事务期间的锁的信息存入临时表LockInfo,并显示。,LockInfo的定义如下: CREATE TABLE LockInfo( Spid INT, -存放系统进程ID TSGdbid INT, -存放数据库ID Obj_Id INT, -存放对象ID IndId SMALLINT, -存放持有锁的索引的标识号 Typ VARCHAR(5), -存放锁定对象类型 Infor VARCHAR(30), -存放锁定对象信息 Model VARCHAR(5), -存放锁定模式 Stat VARCHAR(5) ); -存放锁定状态,8.2.8 SQL Server的并发控制,USE TSG GO DELETE FROM LockInfo BEGIN TRAN UPDATE Book SET Pages=316 WHERE CallNo=F121/L612 INSERT LockInfo EXEC sp_lock spid -spid返回当 前用户进程 COMMIT TRAN SELECT 系统进程ID=spid,数据库=DB_NAME(TSGdbid), 对象=OBJECT_NAME(Obj_ID),索引=( SELECT NAME FROM SYSINDEXES WHERE id=Obj_ID and indid=LockInfo.indid),锁定对象类型=Typ, 锁定对象=Infor, 锁定模式=model, 锁定状态=Stat FROM LockInfo,8.2.8 SQL Server的并发控制,图8-10 例8-7的运行结果,8.3 数据库恢复,可能破坏数据库的故障 事务故障(如运算溢出、并发事务发生死锁被选中撤销的事务、违反完整性限制等原因所造成)、系统故障(如硬件错误、DBMS代码错误、操作系统故障、突然停电等)、介质故障(存储介质损坏)以及计算机病毒的恶意破坏等。 数据库管理系统必须具有把数据库从错误状态恢复到某一已知的正确状态的功能,这就是数据库恢复。 数据库恢复的基本思想 在系统正常运行时建立冗余数据,保证有正确的数据以供恢复使用。 恢复的关键问题 如何来建立并使用冗余数据。 建立冗余数据的方法 备份和登记日志文件。,8.3.1 备份和日志文件,1. 备份及其类型 备份 DBA定期或不定期的将数据库的部分或全部内容复制到安全的存储介质上保存起来的过程。 备份类型 海量备份和增量备份 静态备份与动态备份,8.3.1 备份和日志文件,2. 日志文件 日志 独立的文件。存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退等数据库变化。 日志文件的作用 事务故障和系统故障的恢复必须要利用日志文件。 在动态备份中,必须建立日志文件,备份和日志文件结合起来才能够有效地恢复数据库。 在静态备份中,也可以建立日志文件。 登记日志文件的原则 必须严格的按照并发事务的执行次序记录。 必须先记录日志,后写数据库。,8.3.2 SQL Server的数据库恢复机制,1. 检查点,是在日志中增加的一类新的记录,可以让系统在记录日志文件期间动态的维护日志。对于在检查点之前已经提交的事务,不用再执行重做。,图8-11 检查点技术,8.3.2 SQL Server的数据库恢复机制,2. 恢复模式,1)简单恢复模式,图8-12 简单恢复模式的日志,在简单恢复模式下,在检查点发生时,当前已被提交的事务日志将会被清除。该模式下,无法精确的将数据库恢复到某一时刻,所以容易造成数据丢失。,2)完整恢复模式,完整恢复模式是默认的恢复模式。在该模式下,需要对事务日志进行手工管理。该模式的优点是可以恢复到数据库失败或者指定的时间点上。,图8-13 完整恢复模式的日志,3)大容量日志恢复模式,该模式类似于完整恢复模式,与其不同的是,一些将产生大量日志记录的操作的记录会被精简。,8.3.2 SQL Server的数据库恢复机制,设置恢复模式语句:,ALTER DATABASE TSG SET RECOVERY FULL,FULL(完整恢复模式) BULK_LOGGED(大容量日志恢复模式)SIMPLE(简单恢复模式),8.3.2 SQL Server的数据库恢复机制,3. 数据库备份的类型,SQL Server中的四种备份类型:,1)完整备份:完整的备份所有的数据及数据库对象。,2)事务日志备份:对事务进行备份,包括从上次正确备份之后,到目前为止所有已经完成的事务,必须配合完整备份才能进行恢复。,3)差异备份:将最近一次完整备份后所做的数据库修改进行备份。,4)文件(组)备份:只备份数据库中的个别文件(组)。,8.3.2 SQL Server的数据库恢复机制,4. 备份设备,备份设备是SQL Server存放备份文件的地方,创建备份时必须要选择备份设备。,备份设备可以是本地机器上的磁盘文件、远程服务器上的磁盘文件、磁带以及命名管道。 为了和物理备份设备(磁带、磁盘文件等)实现间接寻址和方便使用,可以为备份设备设置逻辑名称。逻辑设备名称指向特定的物理备份设备,在备份和还原中可以直接使用逻辑设备名称。,8.3.2 SQL Server的数据库恢复机制,图8-14 定义备份设备,1)创建备份设备,(1)使用对象资源 管理器,展开【服务器对象】,右击【备份设备】,弹出的菜单中选择【新建备份设备】。,8.3.2 SQL Server的数据库恢复机制,(2)使用T-SQL语句,sp_addumpdevice devtype=device_type, -指定设备类型,支持disk和tape logicalname=logical_name, -指定逻辑备份设备名称 phydicalname=physical_name -指定物理备份设备名称,举例:创建一个磁盘文件备份设备。,USE master GO EXEC sp_addumpdevice disk,DiskTSG,D:BackupDiskTSG.bak,8.3.2 SQL Server的数据库恢复机制,2)查看备份设备,(1)使用对象资源管理器,展开【服务器对象】【备份设备】。,(2)使用T-SQL语句,EXEC sp_helpdevice,3)删除备份设备,(1)使用对象资源管理器,展开【服务器对象】【备份设备】,右击要删除的设备,选择【删除】。,(2)使用T-SQL语句,sp_dropdevice DiskTSG,8.3.2 SQL Server的数据库恢复机制,5. 备份数据库,1)使用对象资源管理器,右击【TSG】,选择【任务】【备份】 ; 在图8-15中点击【添加】。,图8-15 数据库备份窗口,8.3.2 SQL Server的数据库恢复机制,图8-16 选择备份目标窗口,在图8-16中单击【确定】。 在图8-17中点击【确定】按钮执行备份操作。,图8-17 数据库备份窗口中选择备份设备,8.3.2 SQL Server的数据库恢复机制,成功后将出现备份成功信息。在该信息窗口中点击【确定】即可完成备份。,图8-18 备份成功信息,8.3.2 SQL Server的数据库恢复机制,2)使用T-SQL语句,(1)完整备份,BACKUP DATABASE TSG TO DiskTSG -使用逻辑备份设备 BACKUP DATABASE TSG TO DISK=D:BackupDiskTSG.bak -使用物理名称,(2)差异备份(进行差异备份前,必须至少进行一次完整备份),BACKUP DATABASE TSG TO DiskTSG WITH DIFFERENTIAL,(3)事务日志备份(备份前,必须至少进行一次完整备份),BACKUP LOG TSG TO DISK=D:DiskTSG.bak,(4)文件(组)备份,BACKUP DATABASE TSG FILE=TSG TO DiskTSG -TSG为数据文件的逻辑名称,8.3.2 SQL Server的数据库恢复机制,6. 还原数据库,1)使用对象资源管理器,右击【TSG】,选择【任务】【备份】。 在图8-19中点击“源设备”按钮,单击右侧“”。,图8-19 “还原数据库”窗口,8.3.2 SQL Server的数据库恢复机制,图8-20 “指定备份”窗口,在图8-20的“备份媒体”下拉列表中选择“备份设备”,单击“添加”按钮。,图8-21 “选择备份设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论