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

2008年(239)

我的朋友

分类: Oracle

2008-06-17 23:16:04

数据库系统

ORACLE系统采用多版本两阶段封锁机制。同一个数据在系统中存在多个版本,查询操作不需要任何锁。对数据的更新需要加排它锁,排它锁直到事务提交后才释放。由于不需要为查询处理加锁,因此相对于其他数据库系统,ORALCE系统的锁管理很简单。

 

1. 回退表空间(undo tablespace

 

回退表空间用来存放数据的写前镜像。在ORACLE系统中,任何数据在被更新之前,都要将数据的拷贝存放在回退表空间中,这样系统中就存在同一个数据的多个版本。利用回退表空间中的数据拷贝,可以做到:

1)如果当前正在更新数据的事务失败,就可以直接使用这些数据拷贝,回退事务的更新。

2)查询操作使用这些数据拷贝中的最新版本进行处理,不用等待当前更新事务的完成。

回退表空间不可能有无限大的磁盘空间,因此ORALCE系统循环地使用回退表空间中的磁盘空间。在回退表空间被写满后,系统就覆盖表空间中的最早数据。

下列配置参数和回退表空间有关:

1UNDO_TABLESPACE:设定系统使用的回退表空间。

2UNDO_MANAGEMENT:设定回退段的管理模式。可以使用自动管理,也可以使用手工管理。

3UNDO_SUPPRESS_ERRORS:设定在自动管理模式下,对不再支持的手工管理操作,是否返回出错信息。

4UNDO_RETENTION:设定回退段中的数据在被覆盖之前,需要保留的时间。

 

2. 更新操作

 

ORALCE系统中,更新操作使用两阶段封锁协议。对要更新的数据加排它锁,同时将数据的拷贝存放在回退表空间中。排它锁直到事务提交后才释放。

ORALCE系统在最低限制的级别上锁定数据,系统中的锁可以分为两大类:

1)字典锁(dictionary locks)。在执行DDL操作时,系统自动获得该锁。

2)数据锁(data locks)。在执行DML操作时,系统为表加共享型的表锁(shared table lock)对每一个需要处理的行都加排它型的记录锁。

可以手工使用lock table命令,给要处理的表加锁。配置参数ROW_LOCKING,其确省值为always,表明在数据更新操作期间,系统除了自动使用相应的共享表锁外,只在要处理的记录上加排它锁;如果配置参数取值intent,在数据更新操作期间,系统对整个表使用排他锁,相当于手工使用了lock table命令

如果要锁定整个数据库,可以在打开数据库时,使数据库处于静止状态,这时只有用户SYSSYSTEM可以建立会话。

 

3. 查询操作

 

ORALCE系统中,查询操作可以不使用任何锁。系统在进行查询处理时,首先检查要处理数据是否正由其他事务执行更新操作。如果正在执行更新操作,系统就从回退表空间中找到数据的上一个版本,整个查询操作就使用数据的这一个版本,一直到查询操作所在的事务结束。由于存放在回退表空间中的这一数据版本,不会被任何事务所更新,因此在查询事务中可以反复、多次地读取该数据,而不会出现不可重复读、幻像读现象,相当于SQL-92标准中的隔离级别3——可串行读,尽管ORALCE系统中不存在隔离级别的说法。

然而数据的多版本带来了另外的问题。由于事务的数据查询处理,自始至终都是使用同一个版本,如果一个事务处理的时间很长,而存放在回退表空间中的这一数据版本被覆盖,在事务再次需要读取该数据版本时,由于找不到该数据版本,系统就会报:“ORA-01555 snapshot too old”错误。如果一个历时数小时或者10多个小时的查询事务,最后遭遇ORA-01555错误而失败,将会是多么让人沮丧的一件事。

 

4. 死锁

 

ORACLE系统自动检测和解决死锁。在两个或多个事务发生死锁后,如果一个事务的当前语句发现了死锁,该事务就开始回退。用户可以通过系统的告警、跟踪信息文件,查看死锁信息。

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