• GBase 8s的封锁技术的基本介绍


    一. 封锁的基本概念

            封锁的对象是数据库中的数据对象,如关系型数据库中的表、记录、属性、索引等,

            对数据对象加锁的时机是在事务对其进行操作之前,向系统发出加锁请求。加锁后事务 T就取得了对该数据对象的控制,在事务 T 释放它的锁之前,其他事务不能对此数据对象进行任何操作。封锁是一种排队机制,将并行任务按锁的先后顺序排队,把并行任务变成串行任务。

    二. 锁的类型

            按照锁的行为模式,可以将数据库中的锁分成:共享锁、排它锁和提升锁三种类型。

    1.共享锁

            共享锁简称 S 锁,可以防止其他用户对记录进行修改。若事务 T 对数据对象 R 加上 S锁,则事务 T 只能对数据对象 R 进行读操作或者确定修改记录意图的操作,而不能对 R进行写操作,其他任何事务只能再对 R 加 S 锁或 U 锁(提升锁),而不能加 X 锁(排它锁);当事务 T 释放 R 上的 S 锁后,其他事务才可以对 R 加 X 锁,这就保证了对于加 S 锁的数据 R 可以被其他事务读,但不能够对 R 进行写操作。

    2.排它锁

            排它锁简称 X 锁,用来管理并行更新,排它锁又称为独占锁,若事务 T 对一个对象 R加了排它锁,则只允许 T 对 R 进行读写操作,不允许其他任何事务再对 R 加任何类型的锁,当事务 T 释放 R 上的 X 锁后,其他事务才能够对 R 进行加锁。这样,在事务 T 释放加在 R 上的锁之前,任何事务都不能对 R 进行读写或者确定修改记录的意图操作。同时,若试图在一个已经加了 S 锁或者 U 锁的对象上加 X 锁,则也会冲突。

    3.提升锁

            提升锁简称 U 锁,U 锁是意向锁,表示事务有修改记录的意图。U 锁是一种过渡锁,当要对 U 锁所锁定的对象进行更新操作时,需要将 U 锁提升为 X 锁。若事务 T 对数据对象 R 加了 U 锁,则只允许 T 有对 R 进行修改意图的权限,其他事务只能再对 R 加 S 锁而不能加 U 锁或者 X 锁。

    三. 封锁的粒度

            封锁粒度也称锁对象或者锁范围,表示封锁的作用范围,例如,一条记录上的锁只作

    用于该记录,一个关系上的锁作用于该关系中的所有记录。可见,不同封锁粒度涉及封锁

    的数据量是不同的,封锁对象的级别越高,涉及的数据量越大。封锁粒度越大,如对整个

    数据库进行封锁,则将会对数据库中的全部关系、记录进行封锁,系统处理单个事务的能

    力要强一些,系统开销相对小一些,但是,系统的并发度就会减小,处理并发事务的能力

    就会减弱;反之,封锁粒度越小,如对单个表或记录进行封锁,系统的并发度就会高一些,

    系统开销也就越大。

    1.数据库级锁(Database-Ievel Locks)

            在我们通过 CONNECT DATABASE 或者 CREATE DATABASE 语句访问数据库时,

    系统都将自动在该数据库上加上一个共享(S)锁,这样可以防止其他用户删除数据库或

    者在该数据库上加排它(X)锁。

    2.表级锁(Table-Ievel Locks)

            表级锁就是指锁定的对象是一个表,可以通过如下语句显式地对表加锁和释放锁:

    BEGIN WORK;

    LOCK TABLE tab1 IN EXCLUSIVE MODE;

    LOCK TABLE tab2 IN SHARE MODE;

    UNLOCK TABLE tab1;

            在执行如下一些 DDL 语句时,会自动对表进行加锁,如 ALTER FRAGMENT、

    ALTER INDEX、ALTER TABLE、CREATE INDEX (如果没有使用 ONLINE 模式)、DROP

    INDEX(如果没有使用 ONLINE 模式)、RENAME COLUMN、RENAME TABLE。

    在整个表或者表中的大部分数据需要更新时,使用表级锁的效率高。

    3.页级锁(Page Locks)

            数据库物理上把多行记录存放在数据页(Page)上,页级锁指锁的对象是一个数据

    页,当采用页级锁访问记录时,会自动对访问的数据页进行加锁。当按物理顺序

    访问和更新多条记录时,使用页级锁的效率较高。

    可以通过如下方式指定页级锁模式:

    ALTER TABLE tab1 LOCK MODE (PAGE);

    CREATE TABLE tab1(...) LOCK MODE PAGE ;

    CREATE TABLE 时若不指定锁模式,则将采用 ONCONFIG 参数 DEF_TABLE_LOCKMODE 来指定表的锁模式。

    4.行级锁(Row Locks)

            关系型数据库的数据是按行来管理的,所以行级锁很容易理解。在 OLTP 系统中行级锁的使用很广泛,只需要锁定所访问的少数记录情况,使用行级锁的效率较高。

    可以通过如下方式指定行级锁模式:

    ALTER TABLE tab1 LOCK MODE (ROW);

    CREATE TABLE tab1(...) LOCK MODE ROW ;

    CREATE TABLE 时若不指定锁模式,则将采用 ONCONFIG 参数 DEF_TABLE_LOCKMODE 来指定表的锁模式。

    5.锁(Index key)

            索引采用 B+树的存储结构,所以对索引的锁管理就是管理索引的 Key 值。数据库采用开、闭区域的方式进行索引的锁管理,示例如下:

    Create table tab1 (c1 int,c2 int) lock mode row;

    Create unique index idx_tab1 on tab1(c1);

    Insert into tab1 values(1,2);

    Insert into tab1 values(2,2);

    Insert into tab1 values(3,2);

            假设表中只有如上 3 行记录,当执行 update tab1 set c1=0 where c1>=3;语句时,将对索引 key 值为 3 的记录进行闭区间加锁,意味着此时不能新增 key 值大于 3 的记录。若此时执行 insert into tab1 values(4,2),则会提示 Index 锁冲突错误。

  • 相关阅读:
    设计模式-状态模式在Java中的使用示例-信用卡业务系统
    【深入浅出Spring6】第九期——Spring对事务的支持
    arm版Linux下安装大数据集群各种组件
    【OAuth2】二十、OAuth2扩展协议 PKCE
    java应用诊断工具bistoury本地源码编译、构建及启动完整步骤
    【C++】316 去除重复字母
    纯前端实现 PNG 图片压缩 | UPNG.js
    MyBatis-Plus深入 —— 条件构造器与插件管理
    Java后端开发(九)-- idea(2022版)将commit(未push)的 本地仓库 的 多条commit记录 进行撤销
    WSL-Ubuntu20.04训练环境配置
  • 原文地址:https://blog.csdn.net/weixin_57486087/article/details/125427071