首页 > 范文大全 > 正文

浅谈SQL数据为并发控制技术

开篇:润墨网以专业的文秘视角,为您筛选了一篇浅谈SQL数据为并发控制技术范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘 要】 工作流技术在信息系统的应用并发控制机制的设计是经常要面临的问题,给出一种基于将工作流中数据和任务分离的工作流并发控制机制,在保证工作流正确性的前提下,强有力的约束控制加以实现用数据库中"sql"语言。

【关键词】 SQL 并发控制 措施

Abstract : Workflow technology in information system applications of intercurrent mechanism design is often faces problems, this paper presents a method based on workflow data and task will separate workflow intercurrent mechanism, ensure the correctness of a workflow premise, strong constraint control realization with database SQL "language".

并发性可以定义为允许多个进程同时操作共享数据的能力。在不互相干扰的前提下,并发执行的用户进程的数量越多,数据库系统的并发性就越强。随着信息化的普及和互联网的飞速发展,应用程序的用户越来越多,对并发性的要求也就越来越高。在许多情况下,对并发性的处理直接关系到一个项目的成败。

1.数据库的并发问题

如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生数据不一致问题,这就是并发问题。他包括:

1.1丢失更新。当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。

1.2未确认的相关性(脏读)。当第二个事务选择其他事务正在更新的行时,会发生未确认的相关性问题。

1.3不一致的分析(非重复读)。当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。

1.4幻象读。当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻象读问题。

2.SQL Server的并发处理机制

SQL Server使用锁定确保事务完整性和数据一致性。锁定可以防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同的数据。大多数情况下,你不用关心如何为资源加锁,使用什么类型的锁,这些都是SQL Server自动控制的。但可以通过了解锁并在应用程序中自定义锁来设计更有效的应用程序。

2.1锁粒度

SQL Server具有多粒度锁定,允许一个事务锁定不同类型的资源。锁定在较小的粒度可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度就开发而言是相当昂贵的,因为锁定整个表限制了其他事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。

SQL Server可以锁定的资源如表1所示:

2.2锁模式

SQL Server使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。

表1

SQL Server支持的锁模式如表2所示:

2.3隔离级别

前面已经介绍了锁模式和锁资源的粒度级别,它们可以在一定程度上控制并发。在这个基础上,隔离级别定义了各个并发事务之间的隔离程度。SQL Server定义了四种隔离级别,分别是未提交读、提交读、可重复读和可串行读。这四种隔离级允许不同类型的行为,如表3所示:

表2

表3

2.4新增的快照机制

SQL Server2005中引入了一项被称为行版本控制的技术。利用该技术,在事务修改数据之前会在tempdb数据库中存储一份具有一致性的数据副本,这样当进程需要读取数据时,不必请求资源上的共享锁,可以直接从tempdb数据库的版本存储区中读取,因此它不会与写进程发生冲突,从而提高了并发性。

3.提高系统并发性的一些措施

通过了解SQL的并发控制机制,我们根据减少锁、减少保持锁的时间、减少冲突的原则,提出一些提高系统并发性的措施:

3.1优化SQL语句的性能,尤其是SELECT语句的性能。首先,减少SQL语句的运行时间可以缩短该语句在资源上保持锁的时间,从而允许更多的互斥操作。其次,多数SELECT语句的性能问题都是因没有合适的索引,或者即使有索引但未利用索引所导致的。通过创建合适的索引或优化SOL语句使之利用索引,从而也就避免了在表中的所有行或整个表上保持锁。

3.2使用尽量短的事务,尤其是要避免在事务执行期间与用户交互。这样可以减少锁的保持时间。

3.3在读写操作过多导致大量死锁的系统中使用快照隔离级别或已提交读快照隔离级别,但这时要特别注意优化tempdb数据库。

3.4如果不能使用快照,则尽量使用较低的隔离级别。隔离级别越低,允许的并发性越高,反之亦然。

3.5采用合适的RAID磁盘阵列系统。数据文件适合使用RAID10磁盘阵列,而日志文件通常使用RAIDl就足够了。另外,因为日志是连续写入的,把日志文件和数据文件放在同一个磁盘驱动器会推迟数据操作,所以,最好把日志文件放到单独的磁盘驱动器。

3.6对大量数据使用分区表,通过把请求均匀分布到各个分区来提高并发性。但要注意把每个分区放到不同的磁盘驱动器才能最大限度地发挥它的优化作用。

3.7通过复制把数据库到多个物理的服务器,以实现数据库级的负载均衡。

(作者单位:张丽威 大庆昆仑购物中心 陈浩 大庆油田通信集团)