数据库并行访问也就是两个或两以上用户同时访问同一数据这也是数据库引擎如何设计和实现适度反应所面临的最大问题设计优良性能卓越的数据库引擎可以轻松地同时为成千上万的用户服务而底气不足的数据库系统随着更多的用户同时访问系统将大大降低其性能最糟糕的情况下甚至可能导致系统的崩溃
当然并行访问是任何数据库解决方案都最为重视的问题了为了解决并行访问方面的问题各类数据库系统提出了各种各样的方案 SQL Server和Oracle两大DBMS也分别采用了不同的并行处理方法它们之间的实质差别在哪里呢?
并行访问的问题
并行访问出现问题存在若干种情况在最简单的情形下数量超过一个的用户可能同时查询同一数据就这种情况而言数据库的操作目标很简单尽可能地为用户们提供快速的数据访问 这对我们现在常见的数据库来说不成问题SQL Server和 Oracle 都采用了多线程机制它们当然能够一次处理多个请求
不过在用户修改数据的情况下并行访问问题就变得复杂起来了显然数据库通常只允许唯一用户一次修改特定的数据当某一用户开始修改某块数据时 SQL Server和 Oracle 都能很快地锁定数据阻止其他用户对这块数据进行更新直到修改该数据的第位用户完成其操作并提交交易(commit transaction)但是当某一位用户正在修改某块数据时假设另一位用户又正想查询该数据的信息时会发生什么情况呢?在这种情况下数据库管理系统又该如何动作呢?Oracle 和 SQL Server针对这一问题采取了不同的解决方案
SQL Server方法
现在不妨假设有人开始修改SQL Server上存储的数据于是这块数据立即被数据库锁定数据锁定操作阻塞其他任何访问该数据的连接——连查询操作都不会放过于是这块被锁定的数据只有在交易被提交或者回滚之后才能接受其他访问操作
下面用SQL Server随带的pubs示例数据库做一个简单示范在Query Analyzer内打开两个窗口在第个窗口中执行下列SQL操作语句更新pubs数据库中某一图书的价格
use pubs go begin tran update titles set price = price * where title_id = BU
由于代码中并没有执行commit语句所以数据变动操作实际上还没有最终完成接下来在另一个窗口里执行下列语句查询titles数据表
select title_idtitleprice from titles order by title_id
你什么结果也得不到窗口底部的小地球图标会转个不停尽管我在先前的操作中仅仅更新了一行但是select语句的执行对象却恰好包含了其数据正被修改的一行因此上面的操作不会返回任何数据除非回到第个窗口提交交易或者回滚
SQL Server的数据锁定方案可能会降低系统的性能和效率数据被锁定的时间越长或者锁定的数据量越大其他数据访问用户就越可能不得不等待其查询语句的执行因此从程序员的角度来看对SQL Server编程的时候应该尽量地把交易代码设计得既小又快