2008年(239)
分类: DB2/Informix
2008-06-17 23:15:25
INFORMIX系统采用锁机制作为其并发控制机制。配置参数LOCKS,设定系统初始锁的数目。如果被要求的锁数目超过此参数设置,系统就自动加倍该参数设置,使系统可以使用的锁数目增加一倍。在连续加倍15次之后,如果锁的数目仍旧不足,系统就会报错。
1. 锁的类型
除了共享锁、排它锁、意图锁、更新锁之外,INFORMIX系统引入了字节锁(byte lock)、字节范围锁(byte-range lock)。对可变长字符(varchar)类型字段的更新操作,系统会使用字节锁;对快捷大对象的处理,可以使用字节范围锁,以提高数据利用率。
2. 锁的粒度
INFORMIX系统锁的粒度,可以划分为:数据库、表、页、记录。可以通过以下方式使用数据库锁:
(1)可以在打开数据库时,使数据库处于锁定模式。
(2)在整个数据库系统启动时,使系统进入静止状态。
要使用表锁,可以在命令行或者应用程序中,使用lock table命令。另外表锁也可能由于锁的升级而获得。
页锁和记录锁是表要使用的锁模式。在创建表时,可以指定表所使用的锁模式。如果没有指定,系统就依次检查配置参数DEF_TABLE_LOCKMODE、环境变量IFX_DEF_TABLE_LOCKMODE的设定。缺省情况下,系统使用页锁。表一旦被创建,锁的模式就确定下来,但用户可以使用命令改变它的锁模式。
3. 锁的升级
在INFORMIX系统中,存在两种情况下的锁升级:由记录锁升级为表锁、由页锁升级为表锁。对这两种情况下的锁升级,相关资料中并没有给出有关的说明和限制。
除此之外,对快捷大对象,如果一个事务所拥有的字节范围锁数目,超过系统中当前锁数目的33%,就会出现锁的升级。
4. 锁的等待和超时
可以使用set lock mode命令,在命令行或者应用程序中为单个会话设定锁的等待、超时时间。在缺省情况下系统不会等待,直接返回错误信息。
5. 隔离级别
尽管INFORMIX系统也使用四级隔离级别,但仍旧和SQL-92标准(第6.3.8一节所述)略有不同。INFORMIX系统的四级隔离级别如下:
(1)脏读(dirty read),隔离级别0级。对应SQL-92标准的0级。
(2)落实的读(committed read),隔离级别1级。对应SQL-92标准的1级。
(3)游标稳定性(cursor stability),隔离级别2级。在使用游标(cursor)操作数据时,当前被处理的记录需要加共享锁。在游标指针移动到下一条记录后,当前记录的共享锁被释放,而下一条记录被加共享锁。如果不使用游标,此隔离级别就等同于隔离级别1级。
(4)可重复读(repeatable read),隔离级别3级。对应SQL-92标准的2级和3级。
缺省情况下,INFORMIX系统使用隔离级别1。用户可以使用set isolation命令,为随后要执行的SQL语句,设置要使用的隔离级别。而对不记录日志信息的数据库,则只能使用隔离级别0。
6. 死锁
配置参数DEADLOCK_TIMEOUT,设定了系统检查死锁的时间间隔。