数据库并发处理

数据|数据库

数据库并发处理 一、并发处理
数据库的特点就是数据的集中管理和共享。在通常情况下总是有若干个事务并发地运行,这些并行的事务可能并发地存取相同的数据。因此,数据库管理系统的一个重要任务就是要有一种机制去保证这种并发的存取和修改不破坏数据的完整性,确保这些事务能正确地运行并取得正确的结果。

我们知道,事务并发执行时若不加控制的话,将导致不正确的结果和数据库的不一致状态。为保证数据库数据正确地反映所有事务的更新,以及在一事务修改数据时其它事务不同时修改这个数据,数据库系统用锁来控制对数据的并发存取。
二、ORACLE的并发处理机制
无需任何说明,ORACLE自动提供行级锁,它允许用户在没有冲突的情况下更新表中不同的行。行级锁对联机事务处理非常有用。
1、ORACLE锁
ORACLE锁的类型在正常情况下,ORACLE会自动锁住需要加锁的资源以保护数据,

这种锁是隐含的,叫隐含锁。然而,在一些条件下,这些自动的锁在实际应用时并不能满足需要,必须人工加一些锁。这些人工加的锁叫显示锁。

下面指明了会产生隐含锁的SQL语句:

INSERT;

UPDATE;

DELETE;

DDL/DCL语句。

下面指明了会产生显示锁的SQL语句:

SELECT FOR UPDATE;

LOCK TABLE INXXX MODE。

解决读的不可重复性可以用下面的方法。在ORACLE中,用SELECT FOR UPDATE对预期要修改的记录加行排它锁(X),对表加行共享锁(RS)。它常用于要锁住一行,但不去真的修改这一行。锁之间是有相互作用的。

例如,更新时会对表加RX锁,对行加X锁,而只有RS锁和RX锁允许再加RX锁。因此,当存在RS和RX锁时,表允许更新。再比如,当执行DDL和DCL语句时,会对表加排它锁X,而在存在X、RS、SRX、RX和S锁的前提下,都不能再加X锁。因此,当存在X,RS,SRX,RS或S锁时,不能对表做DCL和DDL操作。这样,数据库会自动防止一个用户更新表中的数据,而其他用户在同时修改表的结构。
2、ORACLE只读事务
ORACLE支持只读事务。只读事务有以下特点:

*在事务中只允许查询

*其它事务可修改和查询数据

*在事务中,其它用户的任何修改都看不见

只读事务的写法为:

SET TRANS ACTION READONLY

SQL语句

COMMIT,ROLLBACK,DDL结束只读事务
3、事务一致性的级别
事务是定义和维护一致性的单位,封锁就是要保证这种一致性。如果对封锁的要求高会增加开销,降低并发性和效率;有的事务并不严格要求结果的质量(如用于统计的事务),如果加上严格的封锁则是不必要和不经济的。因此有必要进行进一步的分析,考察不同级别的一致性对数据库数据的质量及并行能力的影响。

一致性级别定义为如下的几个条件:

1)        事务不修改其它任何事务的脏数据。脏数据是被其它事务修改过,但尚未提交的数据。

2)        在事务结束前不对被修改的资源解锁。

3)        事务不读其它任何事务的脏数据。

4)        在读前对数据加共享锁(RS)和行排它锁,直至事务结束。

*满足条件1的事务叫第0级事务。

*满足条件1和2的事务叫第1级一致性事务。

*满足条件1、2和3的事务为2级一致性事务。

ORACLE的读一致性保证了事务不读其它事务的脏数据。

*满足条件1、2、3和4的事务叫第3级一致性事务。

由ORACLE的三个性质:自动加隐式锁、在事务结束时释放锁和读一致性,使ORACLE成为自动满足以上的0、1和2级一致性事务。因此,ORACLE自动防止了脏读(写-读依赖)。但是,ORACLE不能自动防止丢失修改(写-写依赖),读的不可重复性(读-写依赖),彻底解决并发性中的问题还需满足第4个条件(3级一致性事务),这需要程序员根据实际情况编程。

方法如下:

*如果想在一段时间内使一些数据不被其它事务改变,且在本事务内仅仅查询数据,则可用SETTRANSACTIONREADONLY语句达到这一目的。

*如果想在一事务内修改一数据,且避免丢失修改,则应在读这一数据前用SELECTFORUPDATE对该数据加锁。

*如果想在一事务内读一数据,且想基于这一数据对其它数据修改,则应在读数据前对此数据用SELECTFORUPDATE加锁。对此种类型的应用,用这条SQL语句加锁最恰当。

*如果想避免不可重复读现象,可在读前用SELECTFORUPDATE对数据加锁,或用SET TRANS ACTION READONLY设置只读事务。
三、SYBASE的并发处理机制
SYBASE的并发处理方法与ORACLE类似,但在很多方面不一样。SYBASE有两种粒度的封锁,一种的粒度是页,另一种的粒度是表。SYBASE根据SQL语句的情况决定用页封锁还是用表封锁。
1、页级锁
页级锁有以下所始的三类:

*SHARED:在读操作时加共享锁。在缺省状态下,在读操作完成后释放共享锁。

*EXCLUSIVE:在更新操作时加排它锁。在缺省状态下,在事务完成后释放排它锁。

*UPDATE:在修改和删除操作的初期(读到被修改或删除的页时)加修改锁。在表上加了修改锁之后,还可以再加共享锁,但不能再加修改和排它锁。在进行修改和删除操作时,如果没有共享锁存在,修改锁则转化为排它锁。此锁的目的是为了防止死锁。SYBASE仅当在WHERE子句中包含索引列时才会使用页级的排它锁和修改锁。
2、表级锁
表级锁有以下所示的三类:

*INTENT:当表中存在页级的排它锁和共享锁时,在表上加意向锁。在所有的页级锁释放后,意向锁随着释放。

*SHARED:在读操作时加共享锁。在缺省状态下,在读操作完成后释放共享锁。

*EXCLUSIVE:在更新操作时加排它锁。在缺省状态下,在事务完成后释放排它锁。
3、请求锁
请求锁用以防止共享锁一个接一个无休止地加在表上,从而写事务(要加排它锁)无法进行。
4、SYBASE的封锁级别
在SYBASE根据ANSI标准定义事务的封锁级别:

(1)    级别1:脏读

(2)    (2)级别2:不可重复读

(3)    (3)光标带来的当前值混乱

(4)    SYBASE的缺省一致性级别为1。

如果要达到一致性级别2和3,必须使用HOLDLOCK关键字把共享锁持续到事务的结束。方法如下:

SELECT*FROM AUTHS HOLDLOCK

WHERE AUTHOR_CODE='A00001'

SYBASE还可以通过T-SQL的SET命令改变SYBASE的一致性级别,从而使SYBASE自动在SELECT语句中加HOLDLOCK关键字:

SET TRANS ACTION IS OLATION LEVEL3
5、在SYBASE中提高并发效率的方法
*避免在表中特定的页上多个用户过多的封锁。

*避免在人机交互的应用中定义事务,这样会使某个用户长时间封锁

住表(如去接电话),使其他用户持续等待。

*使事务尽量的短。

*仅当必要时才使用HOLDLOCK关键字。

 

 
  

时间: 2024-11-02 13:25:45

数据库并发处理的相关文章

Ruby on rails开发从头来(五十一)- ActiveRecord基础(并发处理)

在学习Rails中的并发处理的处理前,我们先简单了解下并发处理的概念. 在有多个处理同时访问同一个数据库的应用程序中,可能会出现这样的情况,因为一个处理更新了数据库中的行,而使得另一个处理中持有的数据变得陈旧了.例如,A和B先后从数据库中提取了相同的数据,并都做了修改,这时B先将自己的修改更新会数据库,稍后,A将自己的修改更新回数据库,这时将会覆盖B所作的修改,当B再次提取数据库后,看到的是A修改的结果,而不是自己的. 一个解决办法就是将更新的表或者行进行锁定,防止其他程序进行更新或者访问,锁定

大数据量高并发的数据库优化详解_MsSql

如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 一.数据库结构的设计 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

东海智慧城市系统总集成方案通过评审

日前,县住建部门组织召开东海县智慧城市系统总集成项目专家评审会议.省住建厅建筑节能与科研处处长邵劲松.南京邮电大学物联网学院院长孙知信.南京大学镇江高新技术研究院副院长叶保留.716研究所高级工程师郭荣亮等评审专家参加本次评审. 评审会上,设计单位从政策背景.需求分析.建设规划.分平台设计等方面,就智慧城市公共信息平台.民生服务平台及智慧东海总集成进行详细说明. 与会专家听取了方案报告,观看了部分功能演示.评审组成员分别从方案的实际需求.平台数据业务处理.门户网站及数据存储结构和总集成服务方面进

数据库事务和锁(五)

数据|数据库 死锁问题 死锁是一个很重要的话题.在事务和锁的使用过程中,死锁是一个不可避免的现象.在两种情况下,可以发生死锁.第一种情况是,当两个事务分别锁定了两个单独的对象,这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另外一个事务释放占有的锁,这时,就发生了死锁.这种死锁是最典型的死锁形式.在同一时间内有两个事务A和B,事务A有两个操作:锁定表part和请求访问表supplier:事务B也有两个操作:锁定表supplier和请求访问表part.结果,事务A

快速增加MYSQL数据库连接数负载能力

  第一先限制Innodb的并发处理.如果innodb_thread_concurrency = 0 可以先改成 16或是64 看机器压力,如果 非常大,先改成16让机器的压力下来,然后慢慢增达,适应自已的业务. 处理方法: set global innodb_thread_concurrency=16; 方法一: (window系统中可直接修改my.ini文件) 进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为

并发处理中的问题以及解决这些问题的并发模型

单机并发是集群并发的基础.本文主要将单机并发问题,和解决这些单机并发问题的解决模型.本文只讨论单机并发,集群并发将在我的后续其他文章中讨论,所以本文将单机并发简化称为并发,省去单机二字. 1. 并发问题 什么并发问题,举个例子,一个服务器,有大量的链接上来,每个链接同时发请求.另外一种情况,只有一个链接到服务器,但这个链接短时间内发送大量的请求.有些人只是把第一种场景称之为并发,这种场景多是直接面向用户的,比如web服务器,但是第二种场景也是并发,比如SOA架构中的服务. 这两种的并发是有区别,

oncurrent ash ap-log4j日志存入数据库的多线程并发问题

问题描述 log4j日志存入数据库的多线程并发问题 我使用Mina框架来接收多线程的数据,当我想取得创建时间(从sessionCreated()方法获得).session的上下文信息(从messageReceived()方法获得)以及断开时间(从sessionClosed()方法获得)的时候,我使用log4j的MDC来输出到数据库.可是问题来了,因为要取得断开时间,必须得第一个线程断开后触发sessionClosed()方法取得断开时间后才能将第一个线程的所有信息才会存入到数据库:但是当第一个线

每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享

原文:每一个程序员都应该知道的高并发处理技巧.创业公司如何解决高并发问题.互联网高并发问题解决思路.caoz大神多年经验总结分享 本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头的方案可能并不适合创业公司,那么如何保证高并发问题不成为创业路上的拦路虎,是每一个全栈工程师.资深系统工程师.有理想的程序员必备的技能,希望本文助您寻找属于自己的"成金之

Entity Framework 并发处理

原文http://www.cnblogs.com/Gyoung/archive/2013/01/18/2866649.html 什么是并发? 并发分悲观并发和乐观并发. 悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档锁住,B就没办法打开了,只有等A修改完,完全退出的时候B才能进入修改. 乐观并发:同上面的例子,A,B两个用户同时登录,如果A先进入修改紧跟着B也进入了.A修改文档的同时B也在修改.如果在A保存之后B再保存他的修改,此时系统检测到数据库中