文章目录
- 任务二十二 使用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