刚刚 好684 2022-04-20 10:24 采纳率: 0%
浏览 16

如何验证GBase8s数据库ACID特性?

如何验证GBase8s数据库ACID特性?

这四个特性是通过什么原理来验证的?

  • 写回答

1条回答 默认 最新

  • m0_68451052 2022-04-20 10:27
    关注

    事务原子性验证:
    Set environment sqlmode 'gbase';
    --创建测试表,并插入数据
    Drop table if exists test_acid_a;
    create table test_acid_a(id int,col1 int);
    insert into test_acid_a values(1,0);
    insert into test_acid_a values(2,0);
    insert into test_acid_a values(3,0);
    insert into test_acid_a values(4,0);
    insert into test_acid_a values(5,0);
    insert into test_acid_a values(6,0);
    insert into test_acid_a values(7,0);
    insert into test_acid_a values(8,0);
    insert into test_acid_a values(9,0);
    insert into test_acid_a values(10,0);
    insert into test_acid_a values(11,0);
    insert into test_acid_a values(12,0);
    select * from test_acid_a;
    --随机commit 和rollback
    --创建随机函数
    drop function if exists sp_random;
    create function sp_random(m int,n int) returning int;
    define global seed decimal(10) default 1;
    define d decimal(20,0);
    let d =(seed * 1103515245)+ 12345;
    let seed =d - 4294967296 * TRUNC( d / 4294967296);
    if(mod(trunc(seed / 65536),n)<m)
    then return m;
    else
    return mod(trunc(seed/65536),n);
    end if;
    end function;

    --适配样例中的存储过程,实现随机commit\rollback
    drop procedure protest ;
    create procedure protest()
    define i int;
    define rand int;
    for i in (1 to 99999) loop
    begin work;
    update test_acid_a set col1=i where id=1;
    update test_acid_a set col1=i where id=2;
    update test_acid_a set col1=i where id=3;
    update test_acid_a set col1=i where id=4;
    update test_acid_a set col1=i where id=5;
    update test_acid_a set col1=i where id=6;
    update test_acid_a set col1=i where id=7;
    update test_acid_a set col1=i where id=8;
    update test_acid_a set col1=i where id=9;
    update test_acid_a set col1=i where id=10;
    update test_acid_a set col1=i where id=11;
    update test_acid_a set col1=i where id=12;
    select sp_random(1,99999) into rand from dual;
    if mod(rand,2)=1 then
    commit;
    else
    rollback;
    end if;
    end loop;
    end procedure;

    call protest();
    通过ctrl+c等方式中断运行,并查询每行的col1的都一致
    select * from test_acid_a;

    事务一致性验证
    创建测试表,并插入数据
    create table test_acid_c (id int,col1 varchar2 (10));
    登录不同会话,执行以下操作:
    会话1 会话2
    begin work;
    insert into test_acid_c values(1,'a');
    insert into test_acid_c values(2,'b');
    select * from test_acid_c;
    --等待或查出0条数
    commit;
    select * from test_acid_c;
    --查询出两条记录

    事务隔离性验证
    创建测试表,并插入数据
    create table test_acid_i(id int,col varchar2(10));
    登录不同会话,执行以下操作:
    会话1 会话2
    begin work; begin work;
    insert into test_acid_i values(1,'a'); insert into test_acid_i values(2,'b');
    select * from test_acid_i;
    --查询出一条记录 select * from test_acid_i;
    --查询出一条记录
    commit; commit;
    select * from test_acid_i;
    --查询出两条记录 select * from test_acid_i;
    --查询出两条记录

    事务持久性验证
    退出会话,重新登录后查询
    select * from test_acid_i;
    --查询出两条记录

    评论

报告相同问题?

问题事件

  • 创建了问题 4月20日

悬赏问题

  • ¥15 c++的教材订购系统的订购模块显示运行不出来
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值