本节书摘来自异步社区出版社《Oracle数据库管理与维护实战》一书中的第2章,第2.8节,作者: 何伟娜 , 常建功,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.8 数据库访问
Oracle数据库管理与维护实战
Oracle是大型的多用户并发数据库系统,本节介绍使用Oracle实现多用户并发的基本概念和相关机制。
2.8.1 竞争性、并发性与一致性概念
竞争性、并发性与一致性是所有多计算机系统都会遇到的问题。如计算机网络中文件服务器阻止多个文件同时修改同一个文件,在Windows平台下经常提示另一个用户正在使用此文件、不能修改等。当两个用户要同时获取同一资源时,例如要同时获取打印机,就会产生竞争性。当多个用户获取同一资源,好像每个用户在独自使用该资源时,产生并发性。
Oracle是一个多用户数据库系统,在它内部必须解决资源进程并发性与一致性,使用户对数据库并发、安全的访问。Oracle的并发性与一致性机制并不会使数据库的访问复杂化或降低系统性能。例如,如果几个用户同时想更新表中的同一记录行,Oracle会使用自动锁机制,使事务串行发生,好像是独立发生一样。如事务要查询另一个事务正在更新的表时,Oracle的多版本机制自动允许查询立即执行,并让查询读取更新前的数据。
一致性内最重要的是读一致性,Oracle采取以下措施保证读一致性。
Oracle保证SQL语句在操作某些数据时,其他事务不能更改这些数据。
当一个事务读数据库数据时,这些数据也可以让其他事务读。
当一个事务在写数据时,其他事务仍可正常读这些数据。
但一个事务A在修改一行记录时,其他要更改同一行记录的事务必须要等到事务A完成更新后才能开始对这一行的更改。
2.8.2 事务之间的冲突
多用户数据库系统中,事务具有几种不同形式相互的影响,包括更新丢失、脏读、非重复读等。
1.更新丢失
系统允许多个事务同时更新同一数据时,会发生更新冲突。例如,两个用户都要更新同一表的同一行数据,一个更新就会覆盖掉另一个更新。为防止这种冲突发生,Oracle采取锁机制,防止同时发生更新操作。
2.脏读
当一个事务读取另一个打开事务还未提交的数据时,就会产生脏读。例如,用户A想修改某表中的一行记录,如果该用户还没提交修改,而另一个用户B想查询这行记录,如果返回的是A用户修改后的数据,就是脏读。
Oracle数据库会尽量避免脏读的产生,脏读容易产生问题。如果读取没有提交的数据,而该数据提交失败,那么读出的数据就是无效的,甚至是错误的。Oracle中有一些机制能保证不出现脏读。
3.可重复读与非重复读
在同一事务中,查询返回的是同一数据集,忽略其他已提交或未提交的事务所做的修改,这时发生可重复读。只有当前事务结束、又开始一个新的事务时,查询才能看到最新的结果,这就是可重复读。而如果查询在相同的事务中多次进行,每次都返回最新的数据集,这时发生非重复读。