1 、 理解锁 什么是锁? 锁 是一种软件机制,用于控制对数据库中的数据的访问。在出现同时读取和更新数据的多用户环境中,锁能够确保每个事务的原子性、隔离、一致性和持续性(ACID)不受到威胁,并且维护数据的完整性。 锁的粒度 Informix 提供各种粒度的锁。它们是: 数据库锁:针对整个数据库的锁 表锁:针对整个表的锁 页锁:针对整页数据的锁 行锁:针对一个数据行的锁 字节锁:在包含 VARCHAR 的行上的锁 键锁:在索引中的一个键值上的锁 锁的粒度越粗,它就能锁住越多的数据库对象。例如,对于能够在一个磁盘页上包含 4 行的表,在该页放置一个锁将锁住其中包含的所有 4 个行。相反,如果使用行锁,那么将仅锁住一个行。因此,锁的粒度越粗,并发性就越低,从而影响到性能,尤其是应用程序试图访问相同的行集时。不过,粗粒度也意味着在某些情况下锁住相同数量的行需要的锁数量更少。例如,锁住整个表仅需要一个表锁。 表的锁模式 创建一个表时,它的默认锁粒度是页锁。可以在创建表的过程中使用 LOCK MODE 子句覆盖默认值。例如: CREATE TABLE t1(c1 int) LOCK MODE ROW; 这个上下文中的锁模式表明访问表时需要使用的锁的粒度。如果从 CREATE SQL 语句省略掉这个 LOCK MODE 子句,那么就使用默认的锁模式。 如果表已经创建,那么可以使用 ALTER TABLE 语句更改锁模式。对于以上提到的表 t1 例子,您可以使用下面的 ALTER 语句将锁模式从行锁更改页锁: dbaccess db1 - ALTER TABLE t1 LOCK MODE(PAGE); 可以使用配置参数 DEF_TABLE_LOCKMODE 更改已创建的表的默认锁模式。该参数的值可以是 ROW 或 PAGE。例如,如果 DEF_TABLE_LOCKMODE 设置为 ROW,那么数据库服务器重启之后创建的表的默认锁模式将为 ROW。 类似地,可以使用环境变量 IFX_DEF_TABLE_LOCKMODE 实现相同的效果。注意:如果从运行 oninit 以启动服务器的窗口设置环境变量,那么通过环境变量指定的默认锁模式将对所有会话有效。然而,如果仅在特定客户端会话环境中设置锁模式,那么它仅对特定会话有效。 清单 1 - 4 显示了检查表的锁模式的不同方法(表名为 t1;数据库名为 db1): 清单 1 . 使用 dbschema dbschema -d db1 -t t1 -ss 清单 2. 输出 create table "informix".t1 ( c1 integer ) extent size 16 next size 16 lock mode...