数据库事务管理教学课程(ppt-53页)课件_第1页
数据库事务管理教学课程(ppt-53页)课件_第2页
数据库事务管理教学课程(ppt-53页)课件_第3页
数据库事务管理教学课程(ppt-53页)课件_第4页
数据库事务管理教学课程(ppt-53页)课件_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、 An Introduction to Database Systems1 / 70普通高等教育“十一五”国家级规划教材 数据库系统原理SHUJUKU XITONG YUANLI(第二版)陆慧娟 高波涌 何灵敏编著中国电力出版社第8章 数据库事务管理本章内容概述8.1事务与事务管理8.2并发控制与封锁机制8.3数据库恢复8.1事务与事务管理8.1.1 事务的概念事务定义事务是构成数据库处理逻辑单元的可执行程序,由用户定义的一组操作序列(包括插入、删除、修改或检索等操作)组成,序列中的操作要么全做,要么全不做,是一个不可分割的工作单位。事务概念 事务特性(ACID)原子性(Atomicity)事

2、务中包含的所有操作要么全做,要么全不做原子性由恢复机制实现一致性(Consistency)事务的隔离执行必须保证数据库的一致性事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态数据库的一致性状态由用户来负责,由并发控制机制实现如银行转帐,转帐前后两个帐户金额之和应保持不变(意大利香肠)事务概念隔离性(Isolation)系统必须保证事务不受其它并发执行事务的影响对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行隔离性通过并发控制机制实现持续性(Durability)一个事务一旦提交之后,它对数据库的影响必须是永久的系统发生

3、故障不能改变事务的持久性持续性通过恢复机制实现8.1.2可串行性理论 对于调度S中的每个事务T,如果T中所有的操作在调度中都是连续执行的,那么就称调度S是串行的;否则调度S是非串行的。 串行调度中不会发生不同事务的交替操作。 如果具有n个事务的调度S等价于某个具有相同n个事务的串行调度,那么S就是可串行化调度。 冲突操作是指不同的事务对同一个数据的”读写”操作和“写写”操作,其他操作时不冲突的。不同事务的冲突操作和同一事务的两个操作时不能交换的。例 8.1 有两个调度:事务T1=R1(A)W1(A)R1(B)W1(B),事务T2=R2(A)W2(A)R2(B)W2(B)有调度S1= R1(A)

4、W1(A)R2(A)W2(A)R1(B)W1(B)R2(B)W2(B)R2(A)W2(A) 与 R1(B)W1(B)这两组操作操作的对象不是同一对象,因此不是冲突操作,故把R2(A)W2(A) 与 R1(B)W1(B)交换得到:S2= R1(A)W1(A)R1(B)W1(B) R2(A)W2(A)R2(B)W2(B)S2等价于一个串行调度T1T2,所以S1是冲突可串行化调度。注意:冲突可串行化调度是可串行化调度的充分条件,不是必要条件。还有不满足冲突可串行化条件的可串行化调度。8.1.3 事务基本操作与活动状态1.事务操作的组成事务操作可以看做若干部分组成(1)事务开始(BEGIN TRANS

5、ACTION):事务开始执行;(2)事务读写操作(READ/WRITE TRANSACTION):事务进行数据操作8.1.3 事务基本操作与活动状态(3)事务提交(COMMIT TRANSACTION ): 事务完成所有数据操作,同时保存操作结果,它标志着事务成功完成。(4)事务回滚(ROLLBACK TRANSACTION ):事务未完成所有数据操作,重新返回到事务开始状态,标志着事务的撤销。事务的活动状态8.1.4 SQL对事务管理的支持标准SQL规定事务的开始一般是隐含的,而事务的结束一般使用COMMIT TRANSACTION ROLLBACK TRANSACTION 语句。其中,CO

6、MMIT TRANSACTION 表示提交事务,执行该语句后,事务对数据库的更新结果将被写入物理磁盘数据库;而ROLLBACK TRANSACTION 表示回滚事务,执行该语句后,DBMS 将撤消事务对数据库所作的全部操作,就像事务没有被执行一样。8.2 并发控制与封锁8.2.1 并发操作与数据的不一致性并发操作可能带来的数据不一致性情况有三种 :1.丢失修改2.读过时数据3.读“脏”数据8.2.2封锁 排它锁和共享锁封锁协议活锁和死锁 封锁就是事务 T 在对某个数据对象如关系、元组等进行查询或更新操作以前 ,应先向系统发出对该数据对象进行加锁的请求,否则就不可以进行相应的操作,而事务在获得了

7、对该数据对象的锁以后,其他的事务就不能查询或更新此数据对象,直到相应的锁被释放为止。1)排它锁和共享锁排它锁和共享锁是最基本的封锁方式。如果事务 T 对数据对象 Y 加上了排它锁(记为 X 锁),那么 T 既可以读取 Y ,也可以更新 Y 。如果事务 T 对数据对象 Y 加上了共享锁(记为 S 锁),那么 T 可以读取 Y,但不能更新 Y。一次加锁锁住的数据单位大小被称为锁的粒度(granularity),如果数据单位比较小,我们说锁是细(fine)粒度的,否则就说锁是粗(coarse)粒度的。 2)封锁协议一级封锁协议二级封锁协议 三级封锁协议 封锁协议就是在对数据对象加锁、持锁和释放锁时所

8、约定的一些规则。不同的封锁规则形成了不同的封锁协议(1)一级封锁协议一级封锁协议规定事务 T 在更新数据对象以前,必须对该数据对象加排它锁,并且直到事务 T 结束时才可以释放该锁。利用一级封锁协议可以防止丢失更新问题的发生。(2)二级封锁协议二级封锁协议规定事务 T 在更新数据对象以前必须对数据对象加 X 锁,且直到事务 T 结束时才可以释放该锁,还规定事务 T 在读取数据对象以前必须先对其加 S 锁,读完后即可释放 S 锁。二级封锁协议可以防止丢失更新问题,还可以防止未提交依赖问题,但却不能防止不一致性分析问题。(3)三级封锁协议三级封锁协议规定事务 T 在更新数据对象前,必须对数据对象加

9、X 锁,且直到事务 T 结束时才可以释放该锁,还规定事务 T 在读取数据对象以前必须先对其加 S 锁,该 S 锁也必须在事务 T 结束时才可释放。三级封锁协议可以防止丢失更新和未提交依赖问题,还可以防止不一致性分析问题的发生。但却带来了其他的问题: 活锁和死锁。3)活锁和死锁 (1)活锁在多个事务并发执行的过程中,可能会存在某个尽管总有机会获得锁的事务却永远也没得到锁,这种现象称为活锁。(2)死锁多个并发事务处于相互等待的状态,其中的每一个事务都在等待它们中的另一个事务释放封锁,这样才可以继续执行下去,但任何一个事务都没有释放自己已获得的锁,也无法获得其他事务已拥有的锁,所以只好相互等待下去,

10、死锁的情形如图 8.10 所示。(3)死锁的预防数据库中预防死锁的方法有两种。第一种方法是要求每个事务必须一次性地将所有要使用的数据加锁或必须按照一个预先约定的加锁顺序对使用到的数据加锁。第二种方法是每当处于等待状态的事务有可能导致死锁时,就不再等待下去,强行回滚该事务。 (4)死锁检测(5)死锁恢复 当系统中存在死锁时,一定要解除死锁。具体的方法是从发生死锁的事务中选择一个回滚代价最小的事务,将其彻底回滚,或回滚到可以解除死锁处,释放该事务所持有的锁,使其他的事务可以获得相应的锁而得以继续运行下去。8.2.3 基于时标的并发控制技术 事务 Ti 运行时,有惟一的时间标记,称为时戳,用 TS(

11、Ti) 表示,时标技术的基本思想是:(1) 每个事务开始执行时,系统为这个事务赋予一个时标(一般为当前时间),称之为启动时间,用 TS(Ti) 标识。(2) 每个事务所进行的每个读写操作,均具有时标属性。(3) 系统标识并保存每个有数据项 Q 的最近读时标R_TM(Q)和写时标W_TM(Q)。 (4) 某个事务 T 执行到某一读写操作时,比较事务T的时标 TS(Ti) 与操作对象 Q的最近读写时标:若是读操作,如果 TS(Ti ) W_TM(Q),则拒绝进行读操作,并将 T 的时标赋一个新值(一般为当前时间),重新启动T;否则执行读操作,并修改Q的读时标,使得 R_TM(Q)=max(t,R_

12、TM(Q)。若是写操作,如果 TS(Ti)R_TM(Q) 或 TS(Ti)W_TM(Q),则拒绝读操作,并将T 的时标赋一个新值(一般为当前时间),重新启动T; 否则执行读操作,并修改 Q 的写时标,使得 W_TM(Q)=TS(Ti)。8.2.4 SQL Server 事务和封锁机制1.事务 事务的类型在 Microsoft SQL Server 系统中,可以把事务分成两种类型。一种是系统提供的事务,另一种是用户定义的事务。事务的工作原理2.封锁机制 封锁类型(1) 共享锁(2) 修改锁(3) 独占锁(4) 意向锁(1)共享锁共享锁是非独占的,允许多个并发事务读取其锁定的资源。通常情况下,数据

13、被读取后,SQL Server 立即释放共享锁。例如,执行查询 SELECT 命令时,首先锁定第一页,读取之后释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中修改未被锁定的第一页。(2)修改锁修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁读取数据,然后将共享锁升级为独占锁再执行修改操作。这样如果同时有两个或多个事务对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为独占锁。这时 ,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在

14、修改前直接申请修改锁 ,在数据修改的时候再升级为独占锁 ,就可以避免死锁。修改锁与共享锁是兼容的 ,也就是说一个资源用共享锁锁定后,允许再用修改锁定。(3) 独占锁独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。(4) 意向锁意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。 锁冲突及其防止办法在SQL Server中 ,系统能够自动定期搜索和处理死锁问题。系统在每次搜索中标识所有等待锁定请求的进程会话,如果在下一次搜索中该被标识的进程仍处于等待状态 ,SQL Server 就开始递归死锁搜索。当搜索检测到锁定请求环时,系统将根据各进程会话的死锁优先

15、级别来结束一个优先级最低的事务,此后,系统“回滚”该事务,这样,其他事务就有可能继续运行了。 手工加锁SQL Server 系统中建议让系统自动管理锁,但在 SQL Server 中,封锁操作可以通过SELECT、INSERT、 DELETE、 UPDATE支持显式加锁。这些语句中进行显示设置封锁时,在指定选择表的同时指定对表所实施的封锁(在FROM 子句中),并且保持到事务结束时再释放封锁。8.3 数据库恢复 尽管数据库系统中采取了各种保护措施来保证数据库的安全性和完整性,保证并发事务能够正确执行,但硬件的故障、系统软件和应用软件的错误、操作员的失误以及恶意的破坏仍然是不可避免的。这些故障轻

16、则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中数据部分或全部丢失。因此,DBMS必须具有把数据库从错误状态恢复到某种逻辑一致的状态(也称为正确状态或完整状态)的功能,这就是数据库的恢复功能。各种现有数据库系统运行情况表明,数据库系统所来用的恢复技术是否行之有效,不仅对系统的可靠程度起着决定性作用,而且对系统的运行效率也有很大影响,是衡量系统性能优劣的重要指标。8.3.1数据库恢复的原理及其实现技术恢复系统应该提供两种类型的功能:一种是生成冗余数据,即对可能发生的故障作某些准备;另一种是冗余重建,即利用这些冗余数据恢复数据库。生成冗余数据最常用的技术是数据备份和登

17、记日志文件,在实际应用中,这两种方法常结合起来一起使用。1.数据备份备份也称作转储。数据备份(Data Dump)是指定期地将整个数据库复制到多个存储设备(如磁带、磁盘)上保存起来的过程,它是数据库恢复中采用的基本手段。备份的数据称为后备副本或后援副本,当数据库遭到破坏后就可利用后援副本把数据库有效地加以恢复。备份是十分耗费时间和资源的,不能频繁地进行,应该根据数据库的使用情况确定一个适当的备份周期。1)备份的类型 全备份:即完整的备份整个数据库;增量备份:增量数据库备份只备份自上次数据库备份后发生更改的数据;文件和文件组备份:备份数据库文件或文件组,而不是备份数据库;事务日志备份:只备份事务

18、日志。 2)动态备份和静态备份动态备份也称作在线备份,即在做备份时不中断数据库的运行,不中断数据库上的应用程序和事务处理。 静态备份也称作离线或脱机备份,这意味着在做备份时没有任何数据库事务在运行,这种备份方式应是首选的备份方式。 2.登记日志文件日志文件(Logging)是用来记录事务对数据库的更新操作的文件。对数据库的每次修改,都将被修改项目的原始值和新值写在一个叫做运行日志的文件中,目的是为数据库的恢复保留详细的数据。在日志文件中需要登记以下内容:(1)各个事务的开始标记(BEGIN TRANSACTION) ;(2)各个事务的结束标记(COMMIT或ROLLBACK) ;(3)各个事务

19、的所有更新操作。这里每个事务开始的标记、每个事务的结束标记和每个更新操作均作为日志文件中的一个日志记录(Logrecord)。登记日志文件必须遵循两条原则:(1)至少要等到相应运行记录的撤销部分已经写入日志文件中以后,才允许该事务向数据库中写入记录。 (2)直到事务的所有运行记录的撤销和重做两部分都已写入日志文件中以后,才允许事务完成提交处理。这两条原则称为日志文件的先写原则。8.3.2数据库的故障和恢复策略数据库运行过程中可能发生的故障主要有三类: 事务故障 系统故障 介质故障不同的故障其恢复方法也不一样。1. 事务故障(Transaction Failure)及其恢复事务故障表示由非预期的

20、、不正常的程序结束所造成的故障。恢复的具体做法:(1)反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。(2)对该事务的更新操作执行逆操作。即将日志记录中“更新前的值”写入数据库。这样,如果记录中是插入操作,则相当于做删除操作(因为此时“更新前的值”为空)。若记录中是删除操作,则做插入操作(因为此时“更新后的值”为空);若是修改操作,则相当于用修改前的值代替修改后的值。(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。(4)如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。2. 系统故障(System Failure)及其恢复系统故障是指系统在运

21、行过程中,由于某种原因,造成系统停止运转,致使所有正在运行的事务都以非正常方式终止,要求系统重新启动。恢复的具体做法:(1)正向扫描日志文件(即从头扫描日志文件),找出在故障发生前已经提交事务,将其事务标识记入重做(REDO)队列。同时还要找出故障发生时尚未完成的事务,将其事务标识记入撤销(UNDO)队列。(2)对撤销队列中的各个事务进行撤销(UNDO)处理。进行UNDO处理的方法是,反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库。(3)对重做队列中的各个事务进行重做(REDO)处理。进行REDO处理的方法是:正向扫描日志文件,对每个REDO事

22、务重新执行登记的操作。即将日志记录中“更新后的值”写入数据库。3. 介质故障(Media Failure)及其恢复 介质故障是指系统在运行过程中,由于辅助存储器介质受到破坏,使存储在外存中的数据部分丢失或全部丢失。恢复的具体做法:1)装入最新的数据库副本,使数据库恢复到最近一次转储的可用状态。2)装入最新的日志文件副本,根据日志文件中的内容重做已完成的事务。8.3.3 SQL Server 2005中数据的备份与恢复SQL Server 2005 可以将数据库备份到很安全的地方,当数据库被破坏时,就可以利用备份好的数据恢复数据库。SQL Server 2005提供了四种数据库备份与恢复的方式:

23、(1)全库备份:备份整个数据库。(2)日志备份:备份日志文件。(3)差异备份:仅备份自上次全库备份后被修改过的数据页。(4)文件或文件组备份:对组成数据库的文件或文件组进行单独的备份。小结本章详细介绍了数据库的事务及事务管理、并发控制和数据库恢复技术。事务是数据库的逻辑工作单位,由用户定义的一组操作序列组成,序列中的操作要么全做要么全不做,是一个不可分割的工作单位。事务和程序是两个概念,一般而言,一个数据库应用程序由若干个事务组成,每个事务可以看做是数据库的一个状态,形成了某种一致性,而整个应用程序的操作过程则是通过不同事务使得数据库由某种一致性不断转换到新的一致性的过程。并发控制是为了防止多

24、个用户同时存取同一数据,造成数据库的不一致性。事务是数据库进行并发控制的基本单位,多个事务的并发调度会带来一些问题,如丢失更新、不一致性分析和未提交依赖等问题。实现并发作的方法主要是封锁技术,基本的封锁类型有排它锁和共享锁两种,三个级别的封锁协议可以有效解决并发操作的一致性问题。在封锁过程中还会发生活锁和死锁现象,死锁一旦发生,可以选择一个处理死锁代价最小的事务将其撤消。习题1事务是一个( )。A程序 B进程 C操作序列 D完整性规则2数据恢复的主要依据是( )。ADDA BDD C文档 D事务日志3“日志”文件主要保存于( )。A程序运行的过程 B数据操作C程序执行结果 D对数据库的更新操作

25、4在DB技术中,“脏数据”是指( )。A未回退的数据 B未提交的数据C回退的数据 D未提交随后又被销毁的数据5数据库中数据的正确性、有效性和相容性称为( )。A恢复 B并发控制 C完整性 D安全性6下列不属于并发操作带来的问题是( )。A丢失修改 B不可重复读 C死锁 D读“脏数据”7DBMS普遍采用( )方法来保证调度的正确性 。A索引 B授权C封锁 D日志8设事务T1和T2,对数据库中的数据A进行操作,可能有如下几种情况,请问哪一种不会发生冲突操作( )。 AT1正在写A,T2要读ABT1正在写A,T2也要写ACT1正在读A,T2要写ADT1正在读A,T2也要读A9如果有两个事务,同时对数

26、据库中同一数据进行操作,不会引起冲突的操作是( )。A一个是DELETE,一个是SELECTB一个是SELECT,一个是DELETEC两个都是UPDATEC两个都是SELECT1如果数据库系统对事务的并发操作不加控制,有可能带来哪些问题?2什么是封锁?封锁的基本类型有哪几种?3什么是事务日志?它有什么用途?4什么是数据库的恢复?恢复的基本原则是什么?恢复是如何实现的?(第14讲)考场作文开拓文路能力分解层次(网友来稿)江苏省镇江中学 陈乃香说明:本系列稿共24讲,20XX年1月6日开始在资源上连载【要义解说】文章主旨确立以后,就应该恰当地分解层次,使几个层次构成一个有机的整体,形成一篇完整的文

27、章。如何分解层次主要取决于表现主旨的需要。【策略解读】一般说来,记人叙事的文章常按时间顺序分解层次,写景状物的文章常按时间顺序、空间顺序分解层次;说明文根据说明对象的特点,可按时间顺序、空间顺序或逻辑顺序分解层次;议论文主要根据“提出问题分析问题解决问题”顺序来分解层次。当然,分解层次不是一层不变的固定模式,而应该富于变化。文章的层次,也常常有些外在的形式:1小标题式。即围绕话题把一篇文章划分为几个相对独立的部分,再给它们加上一个简洁、恰当的小标题。如世界改变了模样四个小标题:寿命变“长”了、世界变“小”了、劳动变“轻”了、文明变“绿”了。 2序号式。序号式作文与小标题作文有相同的特点。序号可

28、以是“一、二、三”,可以是“A、B、C”,也可以是“甲、乙、丙”从全文看,序号式干净、明快;但从题目上看,却看不出文章内容,只是标明了层次与部分。有时序号式作文,也适用于叙述性文章,为故事情节的展开,提供了明晰的层次。 3总分式。如高考佳作人生也是一张答卷。开头:“人生就是一张答卷。它上面有选择题、填空题、判断题和问答题,但它又不同于一般的答卷。一般的答卷用手来书写,人生的答卷却要用行动来书写。”主体部分每段首句分别为:选择题是对人生进行正确的取舍,填空题是充实自己的人生,判断题是表明自己的人生态度,问答题是考验自己解决问题的能力。这份“试卷”设计得合理而且实在,每个人的人生都是不同的,这就意

29、味着这份人生试卷的“答案是丰富多彩的”。分解层次,应追求作文美学的三个价值取向:一要匀称美。什么材料在前,什么材料在后,要合理安排;什么材料详写,什么材料略写,要通盘考虑。自然段是构成文章的基本单位,恰当划分自然段,自然就成为分解层次的基本要求。该分段处就分段,不要老是开头、正文、结尾“三段式”,这种老套的层次显得呆板。二要波澜美。文章内容应该有张有弛,有起有伏,如波如澜。只有这样才能使文章起伏错落,一波三折,吸引读者。三要圆合美。文章的开头与结尾要遥相照应,把开头描写的事物或提出的问题,在结尾处用各种方式加以深化或回答,给人首尾圆合的感觉。【例文解剖】 话题:忙忙,不亦乐乎 忙,是人生中一个

30、个步骤,每个人所忙的事务不同,但是不能是碌碌无为地白忙,要忙就忙得精彩,忙得不亦乐乎。 忙是问号。忙看似简单,但其中却大有学问。忙是人生中不可缺少的一部分,但是怎么才能忙出精彩,忙得不亦乐乎,却并不简单。人生如同一张地图,我们一直在自己的地图上行走,时不时我们眼前就出现一个十字路口,我们该向哪儿,面对那纵轴横轴相交的十字路口,我们该怎样选择?不急,静下心来分析一下,选择适合自己的坐标轴才是最重要的。忙就是如此,选择自己该忙的才能忙得有意义。忙是问号,这个问号一直提醒我们要忙得有意义,忙得不亦乐乎。 忙是省略号。四季在有规律地进行着冷暖交替,大自然就一直按照这样的规律不停地忙,人们亦如此。为自己找一个目标,为目标而不停地忙,让这种忙一直忙下去。当目标已达成,那么再找一个目标,继续这样忙,就像省略号一样,毫无休止地忙下去,翻开历史的长卷,我们看到牛顿在忙着他的实验;爱迪生在忙着思考;徐霞客在忙着记载游玩;李时珍在忙着编写本草纲目。再看那位以笔为刀枪的充满着朝气与力量的文学泰斗鲁迅,他正忙着用他独有的刀和枪在不停地奋斗。忙是省略号,确定了一个目标那么就一直忙下去吧!这样的忙一定会忙出生命灵动的色彩。 忙是惊叹号。世界上的人都在忙着自己的事,大自然亦如此,小蜜蜂在忙,以蜂蜜为回报。那么人呢?居里夫人的忙,以放射性元素的发现而得到了圆满的休止符;爱因斯坦在忙,以相对论的问世而画上了惊叹号;

温馨提示

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

评论

0/150

提交评论