数据库原理与应用 课件 张千帆 第12-14章 数据库的并发控制、数据库访问接口、数据库技术的新发展_第1页
数据库原理与应用 课件 张千帆 第12-14章 数据库的并发控制、数据库访问接口、数据库技术的新发展_第2页
数据库原理与应用 课件 张千帆 第12-14章 数据库的并发控制、数据库访问接口、数据库技术的新发展_第3页
数据库原理与应用 课件 张千帆 第12-14章 数据库的并发控制、数据库访问接口、数据库技术的新发展_第4页
数据库原理与应用 课件 张千帆 第12-14章 数据库的并发控制、数据库访问接口、数据库技术的新发展_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

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

文档简介

第12章数据库的并发控制本章介绍事务与事务调度,并发控制技术及死锁的预防与处理方法。数据库系统原理及应用12.1事务概述12.2事务并发与数据不一致12.3基于锁的并发控制技术12.4并发调度的可串行性主要内容事务概述12.112.1.1事务的概念事务不是单行语句,是实现数据操作的一个最基本的单位。这些操作要么都做,要么都不做,是一个不可分割的工作单位。事务的执行是分成众多元操作逐步进行的,元操作一般分为READ和WRITE两种。这两个元操作的含义如下:1)READ(X):将数据项X从数据库磁盘文件中读入事务所在的内存的缓冲区内。2)WRITE(X):将数据项X从事务的内存缓冲中写回数据库磁盘文件中,代表了事务对数据库的更新操作。12.1.1事务的概念例如,如下事务的具体含义是学生持饭卡A在售饭机B上消费5元。STARTTRANSACTIONREAD(Balance_A)Balance_A=Balance_A-5;IFBalance_A<0THENPRINT(‘饭卡余额不足’)ROLLBACKT1ELSEWRITE(Balance_A)READ(Balance_B)MONEY_B=MONEY_B+5WRITE(MONEY_B)COMMIT12.1.2事务的特性原子性(Atomicity)事务中包含的所有操作要么全做,要么全不做原子性由恢复机制实现一致性(Consistency)事务开始前,数据库处于一致性的状态;

事务结束后,数据库必须仍处于一致性状态一致性通过并发控制机制实现隔离性(Isolation)对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行隔离性通过并发控制机制实现持久性(Durability)一个事务一旦提交之后,它对数据库的影响必须是永久的系统发生故障不能改变事务的持久性持久性通过恢复机制实现12.1.3事务模式(1)自动提交事务模式每条单独的语句都是一个事务。每条SQL语句在成功执行完成后,都被自动提交,如果遇到错误,则自动回滚该语句。该模式为系统默认的事务管理模式。(2)显式事务模式应用程序通过指定事务启动和结束的时间来控制事务。MySQL使用STARTTRANSACTION、COMMIT、ROLLBACK、SETAUTOCOMMIT等语句管理本地事务(3)隐式事务模式数据定义语言中的CREATE、ALTER、DROP、RENAME、权限管理中的GRANT、REVOKE、SETPASSWORD等语句会产生隐式提交操作。即在事务中执行完这些语句后会有一个隐式的COMMIT操作,直接提交该语句及其之前的语句。即使当这些语句出现在STARTTRANSACTION与ROLLBACK之间,ROLLBACK也无法撤销该语句及其之前的语句的操作结果。12.1.3事务模式基本的语法格式为:{STARTTRANSACTION|BEGIN[WORK]}[transaction_characteristic[,transaction_characteristic]...][WITHCONSISTENTSNAPSHOT]{COMMIT|ROLLBACK}SETAUTOCOMMIT={0|1}参数:(1)STARTTRANSACTION|BEGIN[WORK]:启动事务。BEGIN或BEGINWORK与STARTTRANSACTION的作用一样,都可以用来启动事务。(2)WITHCONSISTENTSNAPSHOT:有该子句是将STARTTRANSACTION作为事务开始的时间点。没有该子句的情况下,执行STARTTRANSACTION之后的第一条语句时事务才真正开始。(3)COMMIT:提交当前事务,使事务所做的数据更新永久生效。(4)ROLLBACK:事务执行过程中遇到错误时,撤销事务中已经执行的操作,把数据库中的数据回滚到事务执行之前的状态或回滚到某一个指定位置。(5)AUTOCOMMIT:会话变量,可以为每个事务设置提交模式。默认情况下AUTOCOMMIT=1,MySQL启用自动提交模式。这意味着事务中的每个语句都不能用ROLLBACK撤消语句执行的效果,就像每个语句都被STARTTRANSACTION和COMMIT包裹起来一样;如果在语句执行期间发生错误,则会回滚该语句。(6)SETAUTOCOMMIT语句用来改变当前会话的提交模式。执行SETAUTOCOMMIT=0后,系统将禁用语句的自动提交模式,必须使用COMMIT提交事务或使用ROLLBACK撤销事务。12.1.3事务模式例[12-1]:设更新前C00001校园卡的余额是500元,下列两个SELECT语句的查询结果分别是什么?STARTTRANSACTION;UPDATEcardSETbalance=balance-80WHERECID='C00001';SELECTbalanceFROMcardWHERECID='C00001';ROLLBACK;SELECTbalanceFROMcardWHERECID='C00001';第一个SELECE语句查看到的是UPDATE语句执行后的数据,为420第二个SELECE语句查看到的是ROLLBACK语句回滚事务后的结果,为50012.1.3事务模式[例12-2]:分析下列SELECT语句的执行结果。SHOWVARIABLESLIKE'AUTOCOMMIT';SETAUTOCOMMIT=0;STARTTRANSACTION;UPDATEsalebillSETpayamount=30WHEREnumber='1';DELETEFROMsalebillWHEREnumber='2';DROPTABLEsalebill; //隐式提交ROLLBACK;SELECT*FROMsalebill;DROPTABLE语句执行之后,该语句及其之前的语句已经隐式提交,ROLLBACK失效。ROLLBACK语句之后的SELECT语句的执行结果如图所示,系统提示不存在salebill表。12.1.4保存点保存点(SAVEPOINT)是事务中的一个逻辑点,用于指定事务回滚的位置。结束事务时,系统自动删除该事务中定义的所有保存点。(1)定义保存点SAVEPOINT语句用于定义保存点,其语法格式为:SAVEPOINTsavepoint_name参数:

savepoint_name:保存点的名称。12.1.4保存点ROLLBACKTO[SAVEPOINT]savepoint_name(2)回滚到保存点ROLLBACK语句除了可以将事务回滚到事务执行之前的状态并终止事务,还可以与保存点结合使用,将事务回滚到指定的保存点且不终止该事务的执行,其基本的语法格式为:(3)删除保存点RELEASESAVEPOINT语句的作用是从当前事务中删除指定名称的保存点,而不会引发事务的提交或回滚,其基本的语法格式为:RELEASESAVEPOINTsavepoint_name12.1.4保存点[例12-4]:分析下列SELECT语句的查询结果。DELETEFROMbusiness;INSERTINTObusinessVALUES('B001','第一食堂');INSERTINTObusinessVALUES('B002','第二食堂');SELECT*FROMbusiness; //第一个SELECT语句STARTTRANSACTION;INSERTINTObusinessVALUES('B003','百景园餐厅');SAVEPOINTa1;INSERTINTObusinessVALUES('B004','学一超市');SAVEPOINTa2;INSERTINTObusinessVALUES('B005','学二超市');SAVEPOINTa3;INSERTINTObusinessVALUES('B006','车队');SELECT*FROMbusiness;//第二个SELECT语句ROLLBACKTOa3;SELECT*FROMbusiness; //第三个SELECT语句ROLLBACKTOa1;SELECT*FROMbusiness; //第四个SELECT语句ROLLBACK;SELECT*FROMbusiness; //第五个SELECT语句第一个SELECT语句显示事务开始时business表的数据第二个SELECT语句显示六个INSERT语句执行后的结果第三个SELECT语句显示的是回滚到保存点a3、第六个INSERT语句回滚后第四个SELECT语句显示的是回滚到保存点a1,保存点a1之后的第四个、第五个INSERT也回滚后第五个SELECT语句显示的是回滚整个事务后、business表恢复到初始事务开始时的状态事务并发与数据不一致12.212.2事务并发与数据不一致数据库系统也支持事务的并发执行,即多个事务同一时间操作同一数据对象。事务并发执行可以有效提高数据库系统的性能。但是如果不对并发事务进行控制,有可能产生数据不一致。常见的数据不一致问题:丢失修改或覆盖更新(LostUpdate)脏读(DirtyRead)不可重复读(Non-repeatableRead)幻影读(PhantomRow)12.2.1丢失修改或覆盖更新

读A=16

A←A-1写回A=15COMMIT①读A=16

③A←A-1

写回A=15COMMIT

④T2T1(a)丢失修改

丢失修改是指事务1与事务2从数据库中读入同一数据并修改,事务2的提交结果破坏了事务1提交的结果,导致事务1的修改被丢失。12.2.2脏读

读B=200COMMIT

①读B=100B←B*2

写回B②

③ROLLBACKB恢复为100T2T1(b)读“脏”数据事务1修改某一数据,并将其写回磁盘事务2读取同一数据后事务1由于某种原因被撤消,这时事务1已修改过的数据恢复原值事务2读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏”数据。12.2.3不可重复读

读C=100C←C*2写回C=200COMMIT

读C=100

读C=200COMMITT2T1(c)不可重复读

不可重复读是指事务1读取数据后,事务2执行更新操作,使事务1无法再现前一次读取结果。12.2.4幻影读

插入D=200COMMIT

读D={100}

读D={100,200}COMMITT2T1(d)幻影读

幻影读是指事务1读取数据后,事务2插入或删除了其中部分记录,当事务1再次读取数据时,发现某些记录神密地出现或消失了。使事务1无法再现前一次读取结果。基于锁的并发控制技术12.312.3基于锁的并发控制技术封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁;加锁后事务T就对该数据对象有了一定的控制,直到事务T释放它的锁之前。封锁是实现并发控制的一个非常重要的技术。12.3.1锁的基本类型锁代表了对该数据项的访问权限。事务对数据的操作有SELECT、UPDATE、INSERT、DELETE操作,其中SELECT不改变数据的值,称为读操作,后三者会改变数据的值,称为写操作。根据读写数据的权限不同,锁分为共享锁和排他锁两种类型。1)共享锁共享锁(ShareLock),又称读锁,S锁,是指如果事务T对数据对象A加上共享锁且没有释放共享锁之前,事务T可以读A但不可以写A,其它事务只能再对A加共享锁但不能加排他锁,直到事务T释放A上的共享锁。2)排他锁排他锁(ExclusiveLock),又称写锁,独占锁,X锁,是指如果事务T对数据对象A加上排他锁且没有释放排他锁之前,事务T可以读A也可以写A,其它事务不能再对A加任何锁,直到事务T释放A上的锁。12.3.1锁的基本类型锁类型S锁X锁无锁S锁√×√X锁××√无锁√√√锁的相容矩阵“√”表示相容的请求,“×”表示互斥的请求。12.3.1锁的基本类型关系数据库并发控制的原理是当事务访问某一个数据对象时需要先向数据库管理系统申请对该数据对象加锁。如果事务只对该数据进行读操作就申请对该数据对象加S锁,如果需要对该数据进行写操作就申请对该数据对象加X锁。如果申请成功,则事务获得了对该数据相应的操作权限;当事务对数据的操作完成以后,需要释放它所占用的锁,解锁后的数据允许其他事务加锁并访问。12.3.2MySQL的隔离级别隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。按照隔离程度由低到高,MySQL中事务的隔离级别分为:

串行读(Serializable)未提交读(ReadUncommitted,RU)提交读(ReadCommitted,RC)可重复读(RepeatableRead,RR)。其中,可重复读是默认的隔离级别。SETTRANSACTION语句用于指定隔离级别,并一直保持有效直到事务终止或者重新指定隔离级别。1)串行读(Serializable)12.3.2MySQL的隔离级别使用以下语句将系统的隔离级别设置为串行读级别:

SETTRANSACTIONISOLATIONLEVELSERIALIZABLE;串行读是限制性最强的隔离级别,使用悲观锁。悲观锁,是指对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,为了保证事务的隔离性,在整个数据处理过程中,将数据处于锁定状态。悲观锁要求对写操作加X锁,对读操作加S锁,读写互斥,以保证操作最大程度的独占性,以此实现插入、修改、删除数据时其它事务无法修改、也无法读取这些数据,读取数据时其它事务无法修改这些数据。MySQL中,除了串行读隔离级别之外的其它三种隔离级别都采用更加宽松的加锁机制,称为乐观锁。乐观锁机制下,只需要对写操作加X锁,读取数据不需要加锁。

2)未提交读(ReadUncommitted,RU)12.3.2MySQL的隔离级别使用以下语句将系统的隔离级别设置为未提交读级别:

SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;未提交读是限制性最弱的隔离级别,只要求对写操作加X锁,读取数据不需要加锁。3)提交读(ReadCommitted,RC)使用以下语句将系统的隔离级别设置为提交读级别:

SETTRANSACTIONISOLATIONLEVELREADCOMMITTED;提交读隔离级别中,数据的写操作需要加X锁,读操作不需要S锁,并通过多版本并发控制(Multi-versionConcurrencyControl,MVCC),进行快照读(SnapshotRead),以读取最新提交的历史数据的方式避免脏读。

4)可重复读(RepeatableRead,RR)12.3.2MySQL的隔离级别使用以下语句将系统的隔离级别设置为可重复读级别:

SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD;可重复读隔离级别中,数据的写操作需要加X锁,读操作不需要加锁,也是通过MVCC机制进行快照读。与提交读隔离级别不同的是,可重复读隔离级别中快照在事务第一次执行SELECT语句时生成,只有本事务更新数据时才更新快照,本事务执行过程中其它事务提交的数据变更是读取不到的。即无论事务执行过程中是否有其它事务提交了新的版本,该事务没有提交之前读到的都是该事务开始时的版本,以此种方式实现了数据的可重复读和无幻影读。12.3.2MySQL的隔离级别隔离级别丢失修改脏读不可重复读幻影读未提交读×√√√提交读××√√可重复读×××√串行读××××这四种隔离级别,分别有可能产生问题如下所示:12.3.2MySQL的隔离级别[例12-5]:设事务T1读取card表的数据,事务T1未提交之前事务T2申请向该表中插入行,如表所示因为事务T1对card表加S锁,事务T2无法加X锁而等待。直到事务T1提交之后释放对card表的封锁,事务T2才加锁成功并执行插入操作。如果事务T2等待时间超时(这个时间可以进行配置),系统会提示Lockwaittimeout,并把事务T2挂起。12.3.2MySQL的隔离级别[例12-6]:设事务T1向C00002校园卡充值200元,事务T2在事务T1提交之前用该卡消费10元,也申请修改该卡的余额,如表所示。card表中CID是主键,该列上有主键索引,事务T1只对CID='C00002'的行加X锁,事务T2陷入等待状态。事务T1结束并释放锁后,事务T2对CID='C00002'的行加锁并修改数据,保证了事务T1的修改不会丢失。12.3.2MySQL的隔离级别[例12-7]:设事务T1向C00002号卡充值200元还没有提交之前,事务T2读取该卡余额,并在事务T1提交后再次读取该卡余额,如表所示。假设事务T1执行前,C00002卡的余额是276.5元;事务T1执行UPDATE语句向该卡充值200元但没有提交之前,事务T2查看该卡余额,读到的结果是快照读的历史数据276.5元,而不是未提交的数据476.5元;事务T1提交后,事务T2再次读取该卡的余额,读到的结果是476.5元。事务T2前后两次读的结果是不一样的。这是因为读取数据不加锁,事务T2的两次读操作之间,事务T1进行写操作并提交,事务T2每次执行SELECT语句都会重新生成一个快照,读取到的是SELECT语句启动前就已经提交的数据,就出现了两次读取到的数据不一致的现象。12.3.2MySQL的隔离级别[例12-8]:设事务T1多次读取card表的数据,事务T2在事务T1执行期间,对card表进行了数据的插入、修改和删除操作,如表所示。12.3.2MySQL的隔离级别如果事务T1中第一个SELECT语句先对card表做了一次读取操作续:事务T1是读事务,对数据不加锁,事务T2是写事务,成功加X锁后对card表做了插入、修改、删除操作。事务T1的第二、三、四个SELECT语句读到的结果仍然是事务T1的第一个SELECT语句读到的历史版本。当事务T1提交之后,第四个SELECT语句读到的就是事务T2提交后的数据,12.3.3事务开始的时间点STARTTRANSACTION和STARTTRANSACTIONWITHCONSISTENTSNAPSHOT情况下事务开始的时间点是不同的。有WITHCONSISTENTSNAPSHOT子句时,STARTTRANSACTION作为事务开始的时间点。没有WITHCONSISTENTSNAPSHOT子句的情况下,执行STARTTRANSACTION之后的第一条语句时事务才真正开始。并发调度的可串行性12.4SlockBY=B=2UnlockBXlockAA=Y+Z1写回A(=3)UnlockA

SlockAX=A=3UnlockAXlockBB=X+1写回B(=4)UnlockB

T1T212.4.1串行调度和可串行性1)串行(Serial)调度,正确的调度A=3,B=4A=4,B=3

SlockBY=B=3UnlockBXlockAA=Y+1写回A(=4)UnlockA

SlockAX=A=2UnlockAXlockBB=X+1写回B(=3)UnlockB

T1T212.4.1串行调度和可串行性2)不可串行化的调度A=3,B=3,由于其执行结果与1)两个结果都不同,所以是错误的调度。SlockBY=B=2

UnlockB

XlockAA=Y+1写回A(=3)

UnlockA

SlockAX=A=2

UnlockA

XlockBB=X+1写回B(=3)

UnlockBT1T212.4.1串行调度和可串行性3)可串行性(Serializability)A=3,B=4,由于其执行结果与1)的第1个结果都相同,所以是正确的调度。SlockBY=B=2UnlockBXlockA

A=Y+1写回A(=3)UnlockA

SlockA

等待等待等待X=A=3UnlockAXlockBB=X+1写回B(=4)UnlockBT1T212.4.2两段锁协议两段锁协议(Two-phaseLockingProtocol,2PL)是保证事务可串行性的充分而不必要条件。两段锁协议的内容在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁。

事务分为两个阶段第一阶段是获得封锁,也称为扩展阶段;第二阶段是释放封锁,也称为收缩阶段。即:在释放一个封锁之后,事务不再获得任何其他封锁。可串行化的调度中,不一定所有事务都必须符合两段锁协议。12.4.2两段锁协议例:事务1的封锁序列:SlockA...SlockB...XlockC...UnlockB...UnlockA...UnlockC;事务2的封锁序列:SlockA...UnlockA...SlockB...XlockC...UnlockC...UnlockB;事务1遵守两段锁协议,而事务2不遵守两段锁协议。12.4.2两段锁协议12.4.3死锁遵守两段锁协议的事务可能发生死锁XlockR1...XlockR2等待等待等待...XlockR2..XlockR1等待等待.P1P2形成死锁的四个必要条件:(1)保持与请求条件:事务持有数据的锁同时申请对其他数据加锁。(2)非剥夺条件:事务已经获得的锁不能被其它事务剥夺。(3)循环等待条件:每个事务都在等待对其他事务正占用的数据加锁。(4)互斥条件:写锁互斥,数据一次只能被一个事务加写锁。死锁是指数据库系统中两个或多个事务由于无法对需要访问的数据对象加锁而处于互相等待而且永远等待的一种系统状态。12.4.3死锁活锁设事务T1,T2,T3,…,Tn并发访问同一数据对象D,如表12-33所示,事务T1对D加锁后,事务T2申请对D加锁进入等待状态,接着T3请求对D加锁也进入等待状态。T1释放D上的锁后,数据库管理系统采用短作业优先的调度策略,在等待对D加锁的所有事务中批准了作业时间最短的T3的加锁请求,T2只能继续等待。在T2等待的过程中吗,如果不断有其他作业时间更短的事务申请加锁并在T2之前获得锁,T2有可能始终无法对D加锁数据库管理系统可以改变事务的调度策略,采用先来先服务策略或者响应比优先策略都可以避免产生活锁。12.4.3死锁预防死锁一次封锁法:要求每个事务一次就将所有要使用的数据全部加锁,否则就不能执行。缺点:数据对象的封锁范围大,降低了系统的并发性能。顺序封锁法:预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁。缺点:维护数据对象的封锁顺序的系统开销大,且事务很难事先确定下来所有需要封锁的所有数据对象12.4.3死锁超时法:用事务的等待时间作为判断指标,如果一个事务的等待时间超过了规定的时限,就判定该事务处于死锁状态。时限的设置会影响判断结果,时限太短会发生误判,时限太长则不能及时发现死锁。事务等待图法:事务等待图法是一个有向图G=(T,U)描述事务及事务之间的等待状态,其中T为顶点集合,每个顶点表示正在运行的事务,U为优向边的集合,每条有向边表示事务的等待情况,弧尾是申请数据的事务,弧头是占用数据的事务。数据库管理系统周期性地检测事务等待图,如果发现图中存在回路,回路中的事务处于死锁状态。诊断死锁图中存在回路,表明事务T1和事务T2处于死锁状态第13章数据库访问接口本章介绍嵌入式MySQL、ODBC、OLEDB、ADO和JDBC等常用的数据库访问接口的概念和用法。数据库系统原理及应用13.1嵌入式MySQL13.2ODBC13.3OLEDB13.4ADO主要内容13.5JDBC嵌入式MySQL13.113.1嵌入式MySQL嵌入式MySQL是指将MySQL语句嵌入到程序设计语言中使用,即用某种程序设计语言(例如C,C++,Java等)编写程序,该程序的某些函数或某些语句实际是MySQL语句。被嵌入的程序设计语言称为宿主语言,简称为主语言。13.1.1嵌入式MySQL和独立MySQL的区别嵌入式服务器需要通过编程访问和操作,即访问嵌入式MySQL服务器需要通过程序设计语言而不是SQL查询命令。0102嵌入式服务器没有使用完整的身份验证机制,而且在默认的情况下还是禁用的。13.1.2嵌入式MySQL与宿主语言的接口嵌入式程序库提供了许多通过API(ApplicationProgrammingInterface,应用程序接口)访问MySQL数据库系统的函数。通过API,宿主系统通过编程可以充分利用MySQL服务器的强大功能。13.1.3嵌入式MySQL的使用在C语言中,应导入mysql.h库1)启动与退出MySQL13.1.3嵌入式MySQL的使用[例13-1]:连接MySQL服务器。13.1.3嵌入式MySQL的使用2)查询语句mysql_query(mysqlmysql_name,char[]“query_operation”)[例13-2]:读取所有学生的学号及名字。13.1.3嵌入式MySQL的使用[例13-3]:向student表中插入一行数据。13.1.3嵌入式MySQL的使用[例13-4]:修改数据ODBC13.213.2ODBCODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。一组数据的位置,可以使用ODBC驱动程序访问该位置。13.2.1ODBC体系结构数据源名(DSN)应用程序ODBC管理器ODBCAPI(MySQL)驱动程序管理器ODBC驱动程序数据源应用层ODBC层数据层ODBC的体系结构1)数据层数据源实际上是一种数据连接的抽象,指定了数据库位置和数据库类型等信息。数据源有系统数据源、用户数据源和文件数据源三种类型。应用程序如果要通过ODBC访问一个数据库,则首先要创建一个数据源,主要工作是指定数据源,使其关联一个目的数据库以及相应的ODBC驱动程序。13.2.1ODBC体系结构数据源名(DSN)应用程序ODBC管理器ODBCAPI(MySQL)驱动程序管理器ODBC驱动程序数据源应用层ODBC层数据层ODBC的体系结构2)应用层应用程序(Application)是用程序设计语言(如C语言等)编写的程序。使用ODBC接口的应用程序可执行以下任务:请求与数据源的连接和会话(SQLConnect);向数据源发送SQL请求(SQLExecDirct或SQLExecute);对SQL请求的结果定义存储区和数据格式;请求结果;处理错误;如果需要,把结果返回给用户;对事务进行控制,请求执行或回退操作(SQLTransact);终止对数据源的连接(SQLDisconnect)。13.2.1ODBC体系结构数据源名(DSN)应用程序ODBC管理器ODBCAPI(MySQL)驱动程序管理器ODBC驱动程序数据源应用层ODBC层数据层ODBC的体系结构3)ODBC层(1)ODBCAPI访问数据库的接口(2)ODBC管理器其主要任务是管理安装的ODBC驱动程序和管理数据源。(3)ODBC驱动程序管理器应用程序不能直接调用ODBC驱动程序,只可调用ODBC驱动程序管理器提供的ODBCAPI函数,再由ODBC驱动程序管理器负责把相应的ODBC驱动程序加载到内存中,同时把应用程序访问数据的请求传送给ODBC驱动程序。(4)ODBC驱动程序所有的数据库操作由对应的数据库管理系统的ODBC驱动程序完成。ODBC驱动程序具体负责把SQL请求传送到数据源的数据库管理系统中,再把操作结果返回到ODBC驱动程序管理器。后者再把结果传送至客户端的应用程序。13.2.2建立ODBC数据源(1)在MySQL官网上,根据自己计算机的配置下载并安装ODBC,推荐下载MSIInstaller。(2)在“控制面板”→“系统和安全”→“管理工具”中找到“ODBC数据源管理器”,假设要建立一个系统ODBC数据源,选择“dBASEFiles”选项卡,然后单击“添加”按钮13.2.2建立ODBC数据源(4)选择要连接的数据库管理系统的驱动程序。13.2.2建立ODBC数据源(5)为数据源命名,并指定要连接到的数据库服务器的名字和端口,如果使用本地服务器时可输入localhost。在user和password中输入用户名和密码,在database下拉列表中指定要连接的数据库服务器的名字。单击“OK”按钮。13.2.3在VisualStudio2019中使用MySQLODBC(1)安装MySQLODBC并配置完毕后,重启VisualStudio,点击视图->服务器资源管理器(2)然后点击数据连接->添加连接OLEDB13.313.3.1OLEDB概述Microsoft推出的一致数据访问(UniversalDataAccess,UDA)技术为关系型数据和非关系型数据提供了一致的访问接口,为企业级Intranet应用多层软件结构提供了数据接口标准。一致数据访问技术建立在Microsoft的组件对象模型(ComponentObjectModel,COM)基础上,它包括一组COM组件程序,组件与组件之间或者组件与客户程序之间通过标准的COM接口进行通讯。13.3.1OLEDB概述1)ADO和OLEDB一致数据访问包括两层软件接口,分别为动态数据对象(ActiveDataObject,ADO)和对象连接与嵌入的数据库(ObjectLinkedandEmbedDatabase,OLEDB)。ADO提供了高层软件接口,可在各种脚本语言(Script)或一些宏语言中直接使用。OLEDB是一系列直接处理数据的接口,它建立在COM之上,是Microsoft数据访问的基础,ADO接口也是建立在它的基础之上。13.3.1OLEDB概述2)OLEDB的COM对象OLEDB的COM对象主要有DataSource(数据源)对象:数据提供者,负责管理用户权限、建立与数据源的连接等初始操作。Session(会话)对象:提供事务控制机制。Command(命令)对象:支持数据使用者执行各种数据操作,如查询、

修改等。Rowset(行集)对象:提供了数据的抽象表示,是应用程序主要的操作对象。它可以是命令执行的结果,也可以由会话对象产生。13.3.2使用OLEDB客户模板开发应用程序

直接使用OLEDB的对象和接口设计数据库应用程序需要书写大量的代码。为了简化程序设计,VisualC++提供了ATL模板用于设计OLEDB数据应用程序和数据提供程序。利用ATL模板可以很容易地将OLEDB与MFC结合起来,使数据库的参数查询等复杂的编程得到简化。ADO13.413.4.1ADO概述动态数据对象(ActiveXDataObjects,ADO)是介于OLEDB底层接口和应用程序之间的高层接口集。ADO适合于客户/服务器(Client-Server,C/S)系统和基于Web的应用。ADO对象模型的主体对象Connection对象Command对象Recordset对象。13.4.2Connection对象用户必须首先创建一个Connection对象,然后再使用其他的对象来访问数据库。1)Connection对象的主要属性ConnectionString:用于指定连接到的数据源名称Provider:连接着使用的OLEDB提供者。ConnectionTimeOut:执行Open方法之后等待建立连接的描述,默认值为15秒。State:表示Connection对象是打开还是关闭的常量。adStateClosed,表示对象是关闭的,是默认值;adStateOpen表示对象是打开的;adStateConnection表示Recordset对象正在连接;adStateExcuting表示Recordset对象正在执行;adStateFetching表示正在读取Recordset对象的数据记录。13.4.2Connection对象2)Connection对象的主要方法Open:打开带有数据源的连接Close:终止与数据源的连接Execute:没有建立Command对象的情况下执行连接中的一个命令。13.4.2Connection对象3)使用Connection对象的步骤(1)设置ConnectionString的连接属性[例13-5]:定义一个数据源名称为cardmanagement的MySQL数据源,用户名为Person,口令为111111的连接。其连接字符串设置如下:DimcnASADODB.ConnectionSetcn=NewADODB.Connectioncn.ConnectionString=”DSN=数据名称;Database=cardmanagement;UID=Person;PWD=111111”cn.ConnectionString=”Provider=SQLOLEDB.1;UID=Person;PWD=111111;InitialCatalog=cardmanagement;DataSource=数据库服务器名称”其中,“Provider=SQLOLEDB.1”表示要使用MicrosoftSQLServer自身的OLEDB提供者。13.4.2Connection对象(2)使用Open建立连接[例13-5]中使用Open的格式为:cn.Open。(3)使用Close断开连接[例13-5]中使用Close的格式为:cn.Close。一般情况下,Close只是断开了连接,并没有将Connection对象从内存中删除,因此,在关闭之后可使用Open再次打开它。若要将对象从内存中删除,应该使用Set语句,基本的语法格式为:Set对象名=Nothing13.4.3Command对象1)Command对象的主要属性ActiveConnection:指定当前使用的连接。CommandText:命令的文本表示。CommandType:指定要执行的命令的类型,与CommandText属性的内容对应。其取值如下:CmdText指定CommandText的内容是一个文本,即SQL语句;adCmdTable指定CommandText的内容是一个表名;adCmdStoredProc指定CommandText的内容是一个存储过程;adCmdUnknown是默认值,表示命令类型未知。13.4.3Command对象2)Command对象的主要方法Command对象的最主要方法是Execute方法,执行CommandText属性中指定的命令。其执行结果有两种类型:当执行的查询类语句返回查询结果,并将结果放置在Recordset对象中;当执行其他非查询类语句时,如CREATE、INSERT、DELETE等操作时,不返回结果。13.4.3Command对象[例13-6]:在[例13-5]的基础上利用Command对象查询Student中的所有记录。//声明对象DimcnASADODB.ConnectionDimcmASADODB.CommandDimrsASADODB.Recordset//建立连接Setcn=NewADODB.Connectioncn.ConnectionString=”Provider=SQLOLEDB.1;UID=Person;PWD=111111;InitialCatalog=cardmanagement;DataSource=数据库服务器名称”cn.Open//执行命令Setcm=NewADODB.CommandSetcm.ActiveConnection=cncm.CommandText=”SELECT*FROMStudent”Setrs=cm.Execute13.4.4Recordset对象Recordset对象是指从数据提供者那里获取的数据记录集。Recordset对象的主要功能是建立记录集,并支持对记录集中的数据进行浏览、更改、过滤等各种操作。1)Recordset对象的主要属性CursorType:描述记录集中使用的游标类型的常量。CursorLocation:描述记录集中使用的游标位置的常量。LockType:控制编辑过程中设置的加锁类型。ActiveConnection:指定创建Recordset对象所属的Connection对象。Source:设置Recordset对象中数据的来源。BookMark:记录集中当前记录的唯一表示。如果当前行移动到记录集的第一条记录的前边,则BOF为真;如果当前行移动到记录集的最后一行记录的后边,则EOF为真。RecordCount:记录集中记录的个数。Sort:将记录集按字段排序。Filter:允许用户选择记录集中的部分数据。其基本的语法格式为:

Recordset对象名.Filter=”选择表达式”13.4.4Recordset对象2)Recordset对象的主要方法(1)Move方法组13.4.4Recordset对象(2)数据操作方法组13.4.4Recordset对象3)使用Recordset对象ADO对象模型运行用户直接打开一个Recordset对象,或者从Connection对象和Command对象中创建一个Recordset对象。(1)使用Command对象的Execute创建Recordset对象,基本语法格式为:

Setrs=cm.Execute(2)使用Connection对象的Execute创建Recordset对象,基本语法格式为:

Setrs=cn.Execute(“SELECT*FROMTable_Student”)(3)使用Recordset对象的Open创建Recordset对象,基本语法格式为:

rs.Open13.4.5使用ADO对象模型访问数据库使用ADO对象访问数据库的一般步骤为:(1)创建Connection对象与数据源建立连接。(2)创建Command对象,设置该对象的活动连接为上一步的Connection对象,设置命令文本属性为访问数据源所需的命令(如SELECT、INSERT、UPDATE等)。(3)使用Command对象的Execute方法执行命令,如果是查询命令,该方法会返回一个Recordset对象。(4)使用Recordset对象操作记录。13.4.5使用ADO对象模型访问数据库[例13-7]:利用ADO对象模型访问校园卡管理系统的数据库cardmanagement,并且查询Student表。DimcnASNewADODB.ConnectionDimcmASNewADODB.CommandDimrsASNewADODB.Recordsetcn.ConnectionString=”Provider=SQLOLEDB.1;UID=Person;PWD=111111;InitialCatalog=cardmanagement;DataSource=(local)”cn.Opencm.ActiveConnection=cncm.CommandType=adCmdTablecm.CommandText=”Student”Setrs=cm.ExecuteJDBC13.513.5.1JDBC概述Java数据库连接(JavaDataBaseConnectivity,JDBC)是SUN公司为了统一对数据库的操作,定义的一套Java操作数据库的接口。JDBC由数据库厂商去实现,开发人员只需要学习JDBC接口,并通过JDBC加载具体的驱动,就可以操作数据库。定义一个数据库连接的全部工作是由Java代码通过JDBC驱动程序完成的。13.5.1JDBC概述JDBC操作的基本流程1)加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver");2)取得数据库连接[例13-8]:用DriverManager连接数据库。Stringdriver,urluser,pwd;Connectionconn;url=“jdbc:mysql://localhost:3306/cardmanagement?serverTimezone=UTC”;user="root";pwd="123456";conn=DriverManager.getConnection(url,user,pwd);13.5.1JDBC概述3)执行SQL语句(1)用Statement执行SQL语句Stringsql;Statementsm=cn.createStatement();sm.executeQuery(sql);//执行数据查询语句sm.executeUpdate(sql);//执行数据更新语句statement.close();(2)用PreparedStatement执行SQL语句Stringsql;sql=“insertintouser(id,name)values(?,?)”;PreparedStatementps=cn.prepareStatement(sql);ps.setInt(1,xxx);ps.setString(2,xxx);…ResultSetrs=ps.executeQuery();//查询INTc=ps.executeUpdate();//更新13.5.1JDBC概述4)处理执行结果

查询语句,返回记录集ResultSet。

更新语句,返回数值,表示该更新影响的记录数。

ResultSet的方法:

(1)next(),将游标往后移动一行,如果成功返回true;否则返回false。

(2)getInt(“id”)或getString("name"),返回当前游标下某个字段的值。5)释放数据库连接一般先关闭ResultSet,然后关闭Statement或者PreparedStatement,最后关闭Connection。13.5.2JDBC连接数据库(1)在MySQL官网上下载MySQLConnection/J驱动包(2)将下载完成的压缩包解压,再在IDE中添加路径。(3)通过JDBC连接cardmanagement数据库,用importjava.sql.*;导入包第14章

数据库技术的新发展本章介绍数据库技术的新发展,简要介绍面向对象数据库、数据仓库及数据挖掘、XML数据库、云数据库、空间数据库及NoSQL数据库等新型数据库的基本概念,并以Redis为例介绍NoSQL的基本操作。数据库系统原理及应用华中科技大学14.1面向对象数据库p

面向对象数据库(Object

Oriented

DataBase,OODB)是数据库技术与类、封装、接口等面向对象程序设计方法相结合的一种新型数据库。其数据都是以对象/类的形式表示并存储在面向对象数据库中。p

简单来讲,面向对象数据库=面向对象编程语言+关系型数据库特性。在这个公式里面,面向对象编程语言的三个特性为继承、多态、封装;而关系型数据库特性的三个特性:实体完整性、并发、查询处理。p

相较于传统关系型数据库,面向对象数据库采用了类、封装、接口等面向对象程序设计方法,具有高内聚、低耦合的系统结构,系统更灵活、更容易扩展,而且维护成本较低。同时,由于其本身就包含程序设计的思想,有多种接口,在被其他应用软件调取数据的时候会更加方便。14.2数据仓库p

数据仓库是一个面向主题的、集成的、随时间变化的、但信息本身相对稳定的数据集合,一般用于对管理决策过程的支持。①

面向主题:指数据仓库一般为了某个明确的主题,其他与此主题无关的数据一般会被剔除②

集成:指数据仓库一般是由多个数据源经过抽取,转化,加载至同一个数据源的。③

随时间变化:指关键数据隐式或显式的基于时间变化。④

信息相对稳定:指数据装入以后一般只进行查询操作,不支持数据库的增删改操作。14.3XML数据库p

XML数据库是使用XML(EXtensible

MarkupLanguage,可扩展标记语言)格式文档进行存储和查询等操作的数据库管理系统。p

XML数据库是指能管理XML数据的数据库管理系统。p

与传统数据库相比,XML数据库具有以下优势:1、能够对半结构化数据进行有效的存取和管理,如网页内容2、提供对标签和路径的操作。3、便于对层次化的数据进行操作。XML数据库利于文档存储和检索:p

可以用方便实用的方式检索文档,并能够提供高质量的全文搜索引擎;p

能够存储和查询异种的文档结构,提供对异种信息存取的支持。14.4云数据库p

云数据库是指被优化或部署到一个虚拟计算环境中的数据库,可以实现按需付费、按需扩展、高可用性以及存储整合等优势。根据数据库类型一般分为关系型数据库和非关系型数据库(NoSQL数据库)。p

云数据库的特性有:实例创建快速、支持只读实例、读写分离、故障自动切换、数据备份、Binlog备份、SQL审计、访问白名单、监控与消息通知等p

轻松部署用户能够在RDS控制台轻松的完成数据库申请和创建,RDS实例在几分钟内就可以准备就绪并投入使用。用户通过RDS提供的功能完善的控制台,对所有实例进行统一管理。p

高可靠云数据库具有故障自动单点切换、数据库自动备份等功能,保证实例高可用和数据安全。免费提供7天数据备份,可恢复或回滚至7天内任意备份点。p

低成本RDS支付的费用远低于自建数据库所需的成本,用户可以根据自己的需求选择不同套餐,使用很低的价格得到一整套专业的数据库支持服务。优势14.5空间数据库p

空间数据库是指地理信息系统在计算机物理存储介质上存储的与应用相关的地理空间数据的总和,一般是以一系列特定结构的文件的形式组织在存储介质之上的。p

空间数据库描述的主要是地理位置及其相关信息,例如GPS数据,气象数据等复杂的数据。空间数据库的特点1、数据量庞大。2、具有高可访问性

,具有强大的信息检索和分析能力3、空间数据模型复杂,包括属性数据、图形图像数据、空间关系数据。4、属性数据和空间数据联合管理。5、空间实体的属性数据和空间数据可随时间而发生相应变化。6、空间数据的数据项长度可变,包含一个或多个对象,需要嵌套记录。7、一种地物类型对应一个属性数据表文件。多种地物类型共用一个属性数据表文件。8、具有空间多尺度性和时间多尺度性。9、应用范围广泛。14.6NoSQL数据库p

NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。p

NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。优点p

高并发读写p

海量数据的高效率存储和访问p

高可扩展性和高可用性缺点p

没有标准化p

有限的查询功能(到目前为止)p

最终一致是不直观的程序14.6NoSQL数据库NoSql数据库的四大分类p键值(Key-Value)存储

p列存储p文档数据库

p图形数据库目前,常见的NoSQL数据库产品有Redis、Riak、Scalaris、HBase、Cassandra、HadoopDB、MongoDB、Neo4J等。14.6NoSQL数据库1)键值数据库键值(Key-Value)数据库的数据是以键值对的形式存储,其结构形式与哈希(Hash)表比较类似,每个键(Key)都对应着一个值(Value)。Redis是一个应用广泛的开源键值数据库系统,具有以下特征:(1)支持多种数据类型。Redis数据库支持SET、SORTEDSET、LIST、HASH、STRING等五种数据类型和一些通用命令。(2)数据持久化。采用内存和磁盘异步存储机制,数据的读取和写入都在内存中进行。(3)原子级操作。Redis的每一个操作均是原子性的。(4)性能极高。由于数据的读写主要在内存中操作,Redis的读取速度能达到10万次/秒以上,写入速度能达到8万次/秒以上。14.6NoSQL数据库2)列族数据库列族(Column-Family)数据库中数据存储在列族中。列族数据库与键值数据库的相似之处是数据都是键仍然存在,但是它们的特点是指向了多个列。这些列是由列族来安排的。Hbase是基于GoogleBi

温馨提示

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

评论

0/150

提交评论