ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

南大通用 GBase 8s 锁 讲解

2026/8/5 16:20:18 拓冰建站 浏览量
南大通用 GBase 8s 锁 讲解

1.锁机制

  • 在多用户数据库系统中,用户可以锁定一个对象,可以防止其他用户修改锁定的对象
  • 多个并发用户访问数据库数据的情况下,为了保证数据的完整性,锁是必需的
  • 锁作为关联到数据项的对象,程序可以显示对数据加锁,数据库系统也可以隐式的对对象进行加锁

2.锁的分类

  • Shared locks: 共享锁,多个用户可以同时读取相同的记录
  • Exclusive locks: 排他锁,同一时间仅仅有一个用户可以读取相同的记录
  • Promotable (Update) lock: 提升锁,可以升级 (从共享锁提升为排他锁) 或者降级
  • Intent lock: 专一锁,是一种表级锁,标识在该表上有一个游标在读取数据

3.锁的类型介绍

(1)共享锁(lock-S)
  • 如果一个对象上没有排他锁,则共享锁可以加在该对象上
  • 防止其他事务更新数据
  • 但同时,其他事务可以读取该数据 (其他事务可以加共享锁)
  • 多个事务可以在同一个对象上加多个共享锁
(2)排他锁 (lock-X)
  • 如果记录上没有任何锁,排他锁才可以加在该对象上
  • 一旦在记录上加了排他锁,则不能在该记录上增加任何锁了,直至锁释放
  • 防止其他事务读取和更修数据
(3)更新锁 (lock-U)
  • 在更新Cursor中使用
  • 更新锁由cursors 含有 ‘for update’ 选项执行时产生的 ,只能在没有排他锁或者更新锁的记录上加更新锁
  • 当锁定的记录真正执行的时候,更新锁将提升为排他锁
(4)专一锁 (lock-IX or IS)
  • 由IDS自动分配
  • 如果一条记录上的记录被更新,一个排他锁将分配在该记录上,同时将该记录的表上自动加上专一锁
  • 这能保证没有session可以在该表上增加排他锁,只要该表中有记录被增加了排他锁


4.锁的兼容矩阵

SX
STRUEFALSE
XFALSEFALSE

5.锁的有效期

  • 程序控制数据库锁的有效期,当数据库关闭后,数据库锁将被释放
  • 根据数据库是否使用了事务的情况,表锁的有效期不同【如果数据没有使用事务(没有事务日志,也不使用commit work语句),显示对一个表lock,当执行unload table时,锁将被释放;】
  • 当数据库使用了事务,事务结束时,将释放事务所有的锁 table, row, page, and index locks


6.锁的粒度及应用

(1)锁的粒度介绍

锁粒度 说明
数据库锁 针对整个数据库的锁
表锁 针对整个表的锁
页锁 针对整页数据的锁
行锁 针对一个数据行的锁
字节锁 在包含varchar的行上的锁
键锁 在索引中的一个键值上的锁

(2)不同锁粒度的应用

一般来讲,锁的粒度越大,并发性就越低,程序控制将越简单。

  • 数据库锁

    应用数据库管理活动,比如: imports 和 exports

  • 表锁应用

    当整个表或者表的大部分数据需要更新,加表级锁效率高

  • 页级锁应用

    当按数据物理顺序进行访问和更新时,页级锁效率高

  • 行级锁应用

    OLTP 事务采用行级锁,效率高

  • 以下语句将隐式的对表加锁,直到事务结束后释放:
    ALTER FRAGMENT
    ALTER INDEX
    ALTER TABLE
    CREATE INDEX (if not using ONLINE keyword)
    DROP INDEX (if not using ONLINE keyword)
    RENAME COLUMN
    RENAME TABLE

(3)哪种锁粒度是最优的?取决于事务本身的特点

  • 当更新表中相对较小一部分数据的时候,采用行级锁将获取最好的性能
  • 如果一个事务只访问表中一小部分数据,那就采用行级锁
  • 如果一个事务频繁的访问整个表的数据,设置更粗的粒度,比如表级锁
  • 如果更新数据库中大部分表的大部分数据的情况下, 采用数据库级别的锁


(4)关于查看锁及事务情况的指令

  • 查看表锁模式:

    oncheck –pt dbname:tablename

    dbschema –d dbname –t tablename -ss

  • 查看用户进程锁等待情况使用: onstat –u
  • 查看锁使用和等待情况使用: onstat -k
  • 监控数据库事务及其状态使用: onstat -x