Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2796824
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: 数据库开发技术

2009-04-30 10:01:48

   为了保持数据库的一致性,需要有一种机制使数据库在发生错误之后能够回到一致性的状态。现在我们来假设有一个这样的事务,A帐户中有1000元,B帐户中有2000元,现在用户需要从A帐户中转帐50元到B帐户中。数据库正常的运行的事务如下:1,读数据块,A(1000元)到内存中,2,读数据块,B(2000)至内存中,3,将A减去50,写数据块,A(950元),4,将B加50元,写数据块,B(2050元)。整个事务
结束,这是正常情况下。如果在第3步的时候,由于数据库出错而事务终止(如系统崩溃,停电,用户rollback),数据库重新启动的时候A帐户为950元,B帐户为2000元,这显然不正常,我们把这种状态称之为不一致性状态。
   我们需要有一种机制来保护一个事务的原子性,这种机制称之为事务日志。这种思想大体是这样的:在对磁盘数据项进行修改以前,必须把对数据块进行修改的描述信息输出
到稳定存储器上。在ORACLE的解释中,事务日志是指包含对数据块的修改信息。事务日志的写操作全部完成后才开始写真正的数据块。
    现在有事务日志机制以后,我们再来看这种情况,如果在第3步中出现异常,由于事务的日志已经写到磁盘上了,重启以后通过对事务日志进redo,那么就可以对整个事务进行重新
执行,使数据库达到一个致性的状态。如果在进行写事务日志时,系统就出现了异常,这时候就更没关系了,由于事务日志还没有开始写完,所以并不对真正的数据块进行修改,在用户看来这个事务就不曾发生过,这时候数据库还是一致的。
    那对什么时候的事务开始进行REDO呢?这时候后需要引入另外一个种checkpoint技术。关于checkpoint技术以后再讨论。
阅读(4421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~