影子拷贝

来自计算思维百科
跳转至: 导航搜索
影子拷贝1.png

影子拷贝是为了保证对数据库的处理是完整的,也就是要么不做,要么就做完。主要思路就是每次操作执行的时候都给原本拷贝一份副本,对副本进行操作,如果操作完成,就删除原本,把副本作为原本;如果没有完成,就保存原本,副本消失。

基本概念

假设:

  1. 某个时刻系统只执行一个事务,并且执行的时候先对数据库做副本(称为影子副本);
  2. 要处理的数据库只是磁盘上的一个文件,在磁盘上设立一个叫做db-pointer的指针,它指向数据库的当前副本。

什么是指针:指针可以理解为你存放东西的地址,比如对每个抽屉进行编号,然后你有一张纸,纸上写着你要找的抽屉的编号,那么你就可以把这张纸想象成指针,通过纸上的编号,你知道了抽屉的地址,从而顺利找到目标抽屉。

具体过程:

  1. 操作系统被要求确保数据库的新副本上的所有页已经写到磁盘上;
  2. 所有的更新操作都在新建的副本上进行,并且保持原始数据库原封不动。如果任何时候事务不得不中止,数据库新拷贝被简单地删除,原始数据库没有任何影响;
  3. 对数据库的更新操作完成后,修改db_pointer指针,使它指向新拷贝的数据库,于是这个新拷贝的数据库就成为数据库当前的副本,而数据库的旧拷贝就被删除。

为什么能够保证事务的原子性:

  1. 假设修改后的指针在被写到磁盘之前就出现了系统故障(比如突然断电),那么系统重启后,指针还是指向原始数据库,也就是说我们看到的数据库是没有进行任何操作的原始数据库,事务就好像没有执行一样;
  2. 假设修改后的指针在被写到磁盘之后就出现了系统故障,新拷贝的数据库所有更新的页已经被写到了磁盘上,即使系统故障,数据也不会丢失;那么系统重启时,通过db_pointer指针读取到的数据库将是新拷贝的数据库;

向磁盘写入db_pointer指针具备原子性

所以我们可以看到,要保证事务的原子性,就转化为保证向磁盘写入修改后的指针的操作是原子性的,也就是写入的指针要么是修改成功后的指针,要么指针值不变;绝对不允许指针值只修改了一部分;幸运的是磁盘系统能够做到上述要求;

这样,数据库系统的恢复管理部件通过影子拷贝的技术就实现了事务的原子性和持久性。

应用范围

影子拷贝可以应用在银行业,订票系统等领域;如果你想做一连串的事情,然后这一系列的事情是互相联系的,你想保证这一连串的事情要么做完,要么一点都没做,绝不可以半途而废的话,就可以应用影子拷贝的思路规划你的工作。

使用方法及步骤

  1. 创建副本;
  2. 对副本进行操作;
  3. 如果操作完成,保留副本,删除原本;如果操作过程中断,删除副本,保留原本;

应用案例

应用1-word文档编辑管理

影子拷贝2.png

Word文档是微软公司office办公软件中一个很重要的组件,相信你已经了解过word文档。那么在编辑word文档的时候,它会自动生成另外一个一模一样的word文档(如图左边那个),然后我们编辑的是Word文档的副本,如果我编辑完成了,点击保存,那么我编辑的内容就会写入原来Word文档,这就有用到影子拷贝的技术了,不过word文档的管理还是相对复杂些。

可以体现的计算思维

影子拷贝体现了计算思维的冗余保护特点,由于实现起来简单,它被广泛应用于生产生活当中。