当前位置: 首页 > news >正文

openGauss开源数据库实战二十二

文章目录

  • 任务二十二 使用JDBC访问openGauss数据库
    • 任务目标
    • 实施步骤
      • 一、查看和设置隔离级别
        • 1.查看系统默认的隔离级别
        • 2.设置系统默认的隔离级别
        • 3.查看当前会话的隔离级别
        • 4.设置当前会话的隔离级别
        • 5.设置当前事务的隔离级别
      • 二、读提交隔离级别测试
      • 三、可重复读隔离级别测试

任务二十二 使用JDBC访问openGauss数据库

任务目标

了解数据库隔离级别的含义,并对其进行测试。

实施步骤

一、查看和设置隔离级别

1.查看系统默认的隔离级别

使用Linux用户omm,打开一个Linux终端窗口,执行如下的命令:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
show default_transaction_isolation;
\q
2.设置系统默认的隔离级别

使用Linux vi编辑器,修改openGauss数据库管理系统的启动参数文件中的参数default_transaction_isolation,并reload数据库实例使参数生效。过程如下:
在这里插入图片描述
还记我们实验二安装openGauss数据库时用到的cluster_config.xml文件吗?
这个文件是我们自己配置的,指明了数据库的安装的具体位置,笔者安装的位置为:/opt/huawei/data/dn/postgresql.conf。

vi /opt/huawei/install/data/dn/postgresql.conf

将下面这行:

#default_transaction_isolation = 'read committed'

修改为:

default_transaction_isolation = 'REPEATABLE READ'

不需要重新启动数据库,执行下面的命令reload参数文件,让参数生效:

gsql -d postgres -p 26000 -r
select pg_reload_conf();
\q 

执行下面的命令,再次查看系统当前的隔离级别:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
show default_transaction_isolation;
\q

我们发现,openGauss数据库的隔离级别已经被修改为REPEATABLE READ
也可以执行下面的命令来修改系统的隔离级别。直接执行下面的命令,可以一步完成修改参数文件并reload的操作:

gs_guc reload -N all -I all -c "default_transaction_isolation = 'read committed'"
gsql -d postgres -p 26000 -r
show default_transaction_isolation;
\q 

在这里插入图片描述

3.查看当前会话的隔离级别

执行下面的命令和SQL语句,查看当前会话的隔离级别(请注意,有两种查看的方法):

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
show transaction_isolation;
SELECT current_setting('transaction_isolation');
\q
4.设置当前会话的隔离级别

执行下面的命令和SQL语句,设置并查看当前会话的隔离级别:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
-- 下面的语句设置会话的隔离级别为REPEATABLE READ
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ;
show transaction_isolation;
\q

我们发现,会话的隔离级别已经被修改为REPEATABLE READ
退出当前会话之后,再次登录到数据库(新会话),我们发现该会话的隔离级别还是数据库原来的读提交隔离级别:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
show transaction_isolation;
\q

也就是说,在会话级修改数据库的隔离级别,只影响当前的会话

5.设置当前事务的隔离级别

执行下面的命令和SQL语句,设置并查看当前事务的隔离级别:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
-- 显示会话当前隔离级别
show transaction_isolation;
-- 开始一个新的事务,并设置新事务的隔离级别为REPEATABLE READ
START TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
-- 显示事务当前隔离级别
show transaction_isolation;
-- 结束当前事务
commit;
-- 再次显示会话当前隔离级别
show transaction_isolation;
\q

上面的实验显示,登录openGauss DBMS之后,会话的隔离级别是数据库系统默认的隔离级别READ COMMITTED,在该会话中开始的新事务也继承了会话的隔离级别READ COMMITTED我们可以临时改变事务的隔离级别为REPEATABLE READ,当事务结束(本例为提交,也可以是回滚)后,新的事务又会恢复为原来的隔离级别。

二、读提交隔离级别测试

默认情况下openGauss会话的隔离级别是读提交,可以通过下面的实验来验证这一点。本实验需要在手动事务管理环境进行。
使用Linux用户omm,打开一个Linux终端窗口(将该窗口命名为窗口1),执行如下的命令:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
\set AUTOCOMMIT off 
select * from instructor;
select sum(salary) from instructor;

使用Linux用户omm,打开另外一个Linux终端窗口(将该窗口命名为窗口2),执行如下的命令:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
\set AUTOCOMMIT off 
select * from instructor;
select sum(salary) from instructor;

我们可以看到,在窗口1和窗口2的两个openGauss会话中,看到的表instructor的数据是一样的,因此教师的工资总和也是一样的。
继续在窗口2中执行如下的命令,插入一个新的教师记录后没有进行提交,直接查询插人新记录后的工资总和:

insert into instructor values('88888','Comp. Sci.','temp_user',60000);
select * from instructor;
select sum(salary) from instructor;

在这里插入图片描述

可以看到,在窗口2的会话中为表instructor插人一行数据后虽然暂时不提交,但在窗口2的会话中能看到这条记录,统计工资总和时也会加上这行的值(已经变成了958000)。
转到窗口1,执行如下的命令,再次查看表instructor的数据和教师的工资总和:

select * from instructor;
select sum(salary) from instructor;

在这里插入图片描述
目前,openGauss数据库会话的隔离级别是读提交,由于刚才在窗口2中插入的新行还没有提交,因此在这个会话中暂时还看不到表instructor数据的变化。
再次转到窗口2,执行如下的命令,提交刚才新插入的行:

commit;
select * from instructor;
select sum(salary) from instructor;

重新回到窗口1,执行如下命令,再次查看表instructor的数据和教师的工资总和:

select * from instructor;
select sum(salary) from instructor;

在这里插入图片描述
因为在窗口2中将刚才插人的新行进行了事务提交,窗口1的openGauss会话的数据库隔离级别是读提交,因此在窗口1中也可以看到这一已经完成事务提交的新插入行了。
最后做实验清理工作,以便继续下一个测试。首先随便在窗口1或者窗口2中,清除刚才添加的行:

delete from instructor where id='88888';
commit;

然后分别在窗口1和窗口2中执行下面的g8q1退出命令:

\q

三、可重复读隔离级别测试

使用Linux用户omm,打开一个Linux终端窗口(将该窗口命名为窗口1),执行如下的命令,设置新事务的隔离级别为可重复读,并开始这个事务:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
-- 设置新事务的隔离级别为可重复读
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select * from instructor;
select sum(salary) from instructor;

使用Linux用户omm,打开另外一个Linux终端窗口(将该窗口命名为窗口2),执行如下的命令:

gsql -d studentdb -h 192.168.100.91 -U student -p 26000 -W student@ustb2020 -r
\set AUTOCOMMIT off
insert into instructor values('88888','Comp. Sci.','temp_user',60000);
commit;
select * from instructor;
select sum(salary) from instructor;

上面的代码显示,在窗口2的会话中为表instructor插人了一行新记录,并马上进行了事务提交。
在这里插入图片描述

转到窗口1,执行如下的命令:

select * from instructor;
select sum(salary) from instructor;

在这里插入图片描述
我们发现,虽然在窗口2的openGauss会话中将插人表instructor的行提交了,但是因为窗口1openGauss会话的隔离级别是可重复读,故在窗口1的openGauss会话中只能看到事务开始时的数据库数据快照,事务开始之后其他会话对表instructor的修改,在窗口1的openGauss会话中是看不到的。
对于一些报表应用,可重复读隔离级别特别重要,使用可重复读可以使报表结果总是一致的。可重复读隔离级别的实现,并不比读提交昂贵,不用担心因为采用可重复读而造成的性能问题。最后做任务的清理工作,以便继续下一个任务。首先在窗口2中清除刚才添加的行:

delete from instructor where id='88888';
commit;

然后分别在窗口1和窗口2执行gsql退出命令:

\q
http://www.lryc.cn/news/504324.html

相关文章:

  • BurpSuite解决暴力破解时需要验证码问题
  • WPF Combox使用 Text无法选择正确获取CHange后的Text
  • 【速览】设计模式(更新中)
  • 【stable diffusion部署】Stable Diffusion开源本地化的文生图图生图AI
  • 县城楼市踩踏式降价,或现2字头,率先回归月薪一平方的合理价格
  • 计算机组成原理(七):二进制编码
  • 【GitHub分享】you-get项目
  • 论文概览 |《Sustainable Cities and Society》2024.12 Vol.116
  • 解决node.js的req.body为空的问题
  • Mysql学习笔记之安装
  • 将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)
  • 【深度学习】 零基础介绍卷积神经网络(CNN)
  • Coze概述
  • 康佳Android面试题及参考答案(多张原理图)
  • 2022 年 3 月青少年软编等考 C 语言四级真题解析
  • 关于24年408真题的疑问
  • 【容器】k8s学习笔记基础部分(三万字超详细)
  • dayjs(2kb)和momentjs(70kb)关系详述及项目中如何选择讲解
  • 【Python网络爬虫笔记】11- Xpath精准定位元素
  • 6.python列表
  • Android中bindService和startService启动服务有何区别
  • 超牛免费 机械臂模型、工业机器人模型下载网站集合
  • 引领未来的变革:15种前沿RAG技术及其应用探索
  • Scala泛型应用场景
  • AI监控赋能健身馆与游泳馆全方位守护,提升安全效率
  • Avalonia实战实例二:添加三种状态的Svg图片按钮
  • 基于注意力的几何感知的深度学习对接模型 GAABind - 评测
  • arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)
  • Color-Light-Control-and-Four-Way-Responder based on STM32F103C8T6
  • openGauss开源数据库实战二十八