GBase 8s
其他
文章
南大通用 GBase 8s 锁 简介
发表于2026-07-29 17:56:2661次浏览3个评论
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.锁的兼容矩阵
| S | X | |
| S | TRUE | FALSE |
| X | FALSE | FALSE |
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
评论
登录后才可以发表评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25049
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526