2008年(239)
分类: DB2/Informix
2008-06-17 23:31:09
在数据库系统中,多个事务的并发运行、共享数据的处理方式,会给系统带来以下问题:
(1)丢失更新(lost update)
两个事务A和B,先后从数据库读取相同的记录进行更新,在事务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。
对用户来说,丢失更新是不可接受的,任何数据库系统都必须要解决好这个问题。存取未落实的数据,将数据库不一致的数据状态呈现在用户面前,一般情况下也是不允许的。但如果用户不要求数据的准确性,而只对数据库系统的性能感兴趣;或者数据库中的数据只是用作查询处理,就可以不解决此问题,也即允许读取未落实的数据。
对不可重复读、幻像读现象,只会出现在这样的事务中:一个事务需要对同一数据读取两次。这种事务出现的概率很低,而且完全可以通过其它的途径来避免。