数据库原理与应用第11章网络环境下数据共享操作浙江财经学院信息学院软件教研室©2005-2006ZUFE,InformationSchool内容导航理论教学课后习题与上机实验本章要点回顾学习提要与目标学习提要与目标掌握多用户相关概念(共享与独占)了解数据锁定的方法本章内容多用户概念数据库文件的独占和共享文件与记录的加锁和解锁网络环境下相关函数与命令保护数据的其他方法返回多用户概念引入:随着网络技术的发展,用户希望共享数据库的数据,即多个用户同时使用一个数据库里的数据多用户概念:指允许两个或两个以上用户同时访问(读取、修改等)数据库数据和外部设备。多用户环境下产生的最大问题:数据有可能不一致,如何保持数据的一致性成为了多用户环境下遇到的最大问题。多用户概念数据不一致性的原因:对数据修改引起,一般分为以下两种情况。1、程序甲和程序乙同时对文件A修改,修改后谁也无法确定哪些数据是程序甲修改的,哪些数据是程序乙修改的,哪些数据是程序甲乙共同修改的,从而导致数据不一致性。2、程序甲对文件A修改,程序乙对文件A多次读取,造成前后读取数据不一致多用户概念不一致性的两种解决方法:1、独占:当某用户对表文件数据修改时,不允许其他用户对该文件数据执行任何操作,包括读取、修改等,缺点是破坏了网络上共享数据的优点,尽量少用。2、加锁:当某个用户对表文件数据修改时,允许其他用户对该表文件数据读取,但不能修改。加锁后要及时解锁。加锁也带来了两个新问题:冲突和死锁。多用户概念冲突概念:指当一个用户对表文件或记录加锁修改时,另一个用户也企图打开同一表文件或记录进行修改,从而发生冲突,我们可以用捕捉错误命令(ONERROR)处理冲突问题。死锁概念:指一用户锁定一个文件或记录后,又去访问正被另一个用户加锁的文件或记录,而另一个用户对文件加锁后又去访问第一个用户锁定的文件多用户概念或记录。当发生“死锁”时,两个用户无论等待多长时间,都无法等到对方开锁,其过程如图11.1所示。数据1用户A数据2用户B排队等待进入加锁排队等待进入加锁图11.1“死锁情况”11.2数据库文件的独占和共享表文件的独占表文件的共享一、表文件的独占(P470)独占:表文件中数据只能自己使用,别人不能使用,即既不能修改,也不能查看以“独占”方式打开表文件的两种命令格式:1、格式1:SETEXCLUSIVEON/OFF功能:指定Foxpro是否以独占或共享方式打开表文件。当设置为ON时,打开的所有表文件都被该用户独占,当设置为OFF时,打开的表文件变成共享使用一、表文件的独占(P470)2、格式2:USE文件名EXCLUSIVE功能:以独占方式打开表文件例:USE学生EXCLUSIVE注意:SETEXCLUSIVE不能改变原先已经打开的表文件的状态。例如:一个表文件在SETEXCLUSIVEON时打开了,然后执行SETEXCLUSIVEOFF后,这时该表文件仍保持独占的方式打开着。二、表文件的共享(P471)共享:如果只是查看数据,而不进行修改,那么应该以共享方式打开表。“共享”方式打开的命令格式:格式:USE文件名SHARED功能:以共享方式打开表文件例:USE学生SHAREDOPENdatabase数据库名SHARED二、表文件的共享注意点:SETEXCLUSIVEON/OFF与USE文件名[EXCLUSIVE/SHARE]区别:前者一旦设置,对后面打开的文件都将有效,而后者只对该命令中的一个表文件有效。另外,它的优先级高于SETEXCLUSIVE。如果以独占方式打开表文件,别人无论采用独占或共享打开表文件都会出错,另外,如果有人以共享方式打开表文件,其他用户以独占方式打开,也会出现同样问题。11.3文件与记录的加锁和解锁锁的概念自动加锁人工加锁表文件与记录的解锁一、锁的概念锁的概念:某个用户对数据锁上后,别人不可以修改但可以查看。加锁的目的:防止两个用户同时写一个记录,保持数据的一致性。加锁的两种方式:自动加锁人工加锁二、自动加锁概念:许多命令在执行之前,自动锁定一张表或一条记录,如果锁定成功,就执行该命令,执行后自动解除锁定。1、表文件自动加锁:(1)如果要对整个表文件或表文件中的多条记录进行修改,则必须先对整个表文件加锁。(2)加锁的命令如下:二、自动加锁APPENDAPPENDFROMDELETE范围(一个记录以上)INDEXJOINRECALL范围(一个记录以上)REPLACE范围(一个记录以上)UPDATE二、自动加锁2、表文件头自动加锁(1)某些命令,如向表中追加记录,虽然对当前表中记录没有影响,但是必须保证表头结构不被修改,因此要锁定它。(2)加锁命令如下:APPENDBLANKAPPENDFROMARRAYINSERT-SQL二、自动加锁3、记录自动加锁(1)如果用户只对表文件中一条记录进行修改,那么只需对相关记录进行加锁。(2)加锁的命令如下:命令锁定范围APPENDMEMO当前记录DELETE当前记录DELETENET1当前记录DELETERECOREN第n条记录二、自动加锁命令锁定范围GATHER当前记录MODIFYMEMO编辑开始时的当前记录READ当前记录RECALL当前记录RECALLNEXT1当前记录RECALLRECORDN第n条记录REPLACE当前记录(和所有别名字段中的记录)REPLACENEXT1当前记录(和所有别名字段中的记录)REPLACERECORDN第n条记录(和所有别名字段中的记录)SHOWGETS当前记录(和所有别名字段中的记录)二、自动加锁4、不需要加锁的命令(1)执行只读的命令,任何时候都可以成功执行,不需要加锁。(2)不需加锁命令如下:COPYCOPYSTRUCTRUELIST/DISPLAYLOCATECOUNT/SUM/AVERAGESORTTOTAL三、人工加锁概念:用户通过函数对表文件或记录进行人工加锁,使用完后要尽快解锁。人工加锁使用的三个函数1、表文件加锁函数格式:FLOCK([工作区号/别名])函数值类型:逻辑型功能:即给指定工作区号或别名的表文件加锁,如果省略工作区号或别名,则给当前工作区的表文件加锁。三、人工加锁2、记录加锁函数格式:RLOCK([工作区号/别名]/[记录号列表,工作区号/别名])函数值类型:逻辑型功能:锁定表文件中一条或多条记录。如果不指定工作区号或别名,那么将锁定当前工作区中的当前记录例:RLOCK(‘1,3,5’,’学生’)RLOCK(‘学生’)RLOCK()三、人工加锁注意:如果要锁定多条记录,必须设置SETMULTILOCKON,如果是SETMULTILOCKOFF,则最后一条记录被锁定。3、LOCK()函数格式:LOCK([工作区号/别名]/[记录号列表,工作区号/别名])函数值类型:逻辑型功能:锁定表文件中一条或多条记录。如果不指定工作区号或别名,那么将锁定当前工作区中的当前记录三、人工加锁注意:该函数与RLOCK()的功能完全一样有些操作必须在独占方式下才能执行,如INSERT,INSERTBLANK,MODIFYSTRUCTURE,PACK,REINDEX和ZAP,因为它们会使表中的所有记录发生改变或者使表的结构发生变化。因此,不是说有了锁,独占打开表的方式就没有用了。三、人工加锁例11.1一个人工加锁的例子(P475)SETEXCLUSIVEOFFSETREPROCESSTO2USE学生IFFLOCK()REPLACEALL奖学金WITH奖学金+100UNLOCKELSE?”文件不能加”ENDIF四、表文件与记录的解锁表文件或记录锁定后应尽快解锁,以便其他用户可以进行修改操作。解锁命令如下:格式:UNLOCK[IN工作区号/别名]/[ALL]功能:对一个表文件、一条或多条记录进行解锁,或对所有表文件和所有记录进行解锁。11.4网络环境下相关函数与命令显示和获取锁定状态参数设置命令错误捕捉命令与函数一、显示和获取锁定状态显示锁定状态命令格式:LISTSTATUS/DISPLAYSTATUS功能:显示VisualFoxpro当前工作环境的信息锁定状态测试函数格式:SYS(2011)函数类型:字符型功能:以字符串形式返回当前工作区中表文件或记录的锁定状态。二、参数设置命令锁定记录条数开关命令格式:SETMULTILOCKS[ON/OFF]功能:决定RLOCK()或LOCK()是否能锁定多条记录。设置锁定记录条数命令格式:SETREPROCESSTO次数[SECONDS]/TOAUTOMATIC二、参数设置命令功能:指定一次锁定尝试不成功后,VisualFoxpro对文件或记录再次尝试加锁的次数或时间。一般情况下我们只需要试一次就可以了,故一般在程序开头设置SETREPROCESSTO1。例:SETREPROCESSTO1SELECT学生JSCG=FLOCK()IFJSCG*进入数据的修改处理二、参数设置命令ELSEMESSAGEBOX(‘其他人正在修改数据,您不能修改,请稍后再试。’,16,‘注意’)ENDIFUNLOCK自动锁定开关命令格式:SETLOCKON/OFF功能:激活或废止在某些命令中的自动锁定功能三、错误捕捉命令与函数错误捕捉命令格式:ONERROR[Command]功能:当出现错误时,指出要执行的命令。[Command]指定要执行的VisualFoxpro命令。执行该命令后,程序将从引起错误的程序行的下一行重新开始执行。若错误处理程序中包含RETRY命令,则重新执行引起错误的程序行。三、错误捕捉命令与函数错误类型测试函数格式1:ERROR()函数值类型:数值型功能:返回触发ONERROR例程的错误编号格式2:MESSAGE([1])函数值类型:字符型功能:以字符串形式返回当前错误信息,或者返回导致这个错误的程序行内容。11.5保护数据的其他方法数据缓冲技术使用事务处理机制更新数据一、数据缓冲技术采用缓冲目的:在更新过程中对数据加以保护。缓冲技术采用的两种方法:1、将当前记录加锁后赋值到内存或磁盘区域,即缓冲区,当记录指针移动或发出更新命令时,直接将缓冲区内容更新到原来表文件中。2、先将当前记录复制到缓冲区,并允许对其进行编辑,而其他用户仍然可以访问原来记录,一、数据缓冲技术当记录指针移动或发出更新命令时,则先锁定记录,并对缓冲区数据与原表数据进行比较,再执行数据更新。启动缓冲之前必须选定缓冲方法和锁定方式。1、选择缓冲方法:记录缓冲:只对一个记录进行访问,选择该缓冲表缓冲:若对多条记录进行更新,选择表缓冲。一、数据缓冲技术2、选择锁定方式:锁定方式有下面两种:保守式缓冲开放式缓冲3、缓冲的启动使用CURSORSETPROP()函数格式:CURSORSETPROP(属性[,属性值[,工作区号、别名]])功能:设置VisualFoxpro表文件或临时表的属性。如果省略属性值,则取系统默认值。一、数据缓冲技术表11.2Buffering属性取值及含义属性值含义1无缓冲2保守式记录锁定3开放式记录锁定4保守式表锁定5开放式表锁定一、数据缓冲技术4、在表缓冲区中追加和删除记录可以在启用表缓冲之后追加和删除记录。追加的记录将添加到缓冲区末尾。要访问缓冲区中所有记录,包括追加记录,可使用RECNO()函数。5、执行更新(三种方法)1、在表单设计器中,在表单的BufferMode属性中设置2、选择”工具”菜单的”选项”命令,在弹出”选项”窗口中选择”数据”选项卡,在”缓冲”下拉列表框中选择。3、在代码中设置二、使用事务处理机制更新数据事务处理机制:事务处理机制将整段代码作为一个受保护的、可恢复的对象的单元,其功能超过了对记录缓冲和表缓冲所提供的保护,能更好地保护更新操作,当发生更新错误时能从整段代码中还原到更新之前的状态。1、控制事务处理的命令(1)格式:BEGINTRANSACTION二、使用事务处理机制更新数据功能:启动一个事务处理(2)格式:ENDTRANSACTION功能:结束当前事务(3)格式:ROLLBACK功能