Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432845
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: DB2/Informix

2008-06-17 23:31:09

并发处理可能出现的问题

在数据库系统中,多个事务的并发运行、共享数据的处理方式,会给系统带来以下问题:

1)丢失更新(lost update

两个事务AB,先后从数据库读取相同的记录进行更新,在事务A完成后事务B的更新覆盖了事务A的更新,从而事务A的更新丢失。其具体处理过程可见图6-1

2)存取未落实的数据(read uncommitted

事务A更新数据库中的数据,在更新被落实之前,事务B读取了该数据,随后事务A由于失败而回退,该更新并没有成功,而事务B读取的却是更新后的内容。其具体处理过程可见图6-2

 

         

 

3)不可重复读(unrepeatable read

事务A在整个事务的执行过程中需要两次读取同一个数据,在第一次的读取之后,事务B更新了该数据;事务A第二次读取该数据,得到的是事务B更新后的内容,从而事务A在执行过程中,对同一数据的两次读取得到不同的内容。其具体处理过程可见图6-3

 

         

 

4)幻像读现象(phantom read

事务A在整个事务的执行过程中需要两次读取同一个区间范围内的数据(在表中,落在此区间范围内的记录,可能有一条、多条,也可能一条也没有),在第一次的读取之后,事务B向表中插入一条记录或者更改现有的一条记录,新增加记录或者被更改记录满足事务A读取的区间范围;事务A第二次读取该区间范围内的记录,结果将包含事务B刚刚插入或者更改的记录,从而事务A在执行过程中,对同一区间数据的两次读取得到不同的内容。其具体处理过程可见图6-4

依据这些问题对系统的影响程度,从高到低依次为:丢失更新、存取未落实的数据、不可重复读、幻像读现象。而为解决这些问题要付出的系统代价,正好和前面的这个顺序相反,具体可见图6-5

 

 

对用户来说,丢失更新是不可接受的,任何数据库系统都必须要解决好这个问题。存取未落实的数据,将数据库不一致的数据状态呈现在用户面前,一般情况下也是不允许的。但如果用户不要求数据的准确性,而只对数据库系统的性能感兴趣;或者数据库中的数据只是用作查询处理,就可以不解决此问题,也即允许读取未落实的数据。

对不可重复读、幻像读现象,只会出现在这样的事务中:一个事务需要对同一数据读取两次。这种事务出现的概率很低,而且完全可以通过其它的途径来避免。

阅读(685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~