1、提交事务/FUT_SWGL_TJ :
--创建表并插入数据:create table FUT_SWGL_TJ (c1 int,c2 varchar(10));
insert into FUT_SWGL_TJ values(1,'aa');
--提交事务:commit;
--查询表数据:select * from FUT_SWGL_TJ;
2、回滚事务/FUT_SWGL_HG:
--建表并插入数据:
create table FUT_SWGL_HG (c1 int,c2 varchar(10));
insert into FUT_SWGL_HG values(1,'aa');
--查询表数据:select * from FUT_SWGL_HG;
--执行回滚:rollback;
--再查询表数据:select * from FUT_SWGL_HG;
返回结果集为空,插入的数据已被回滚掉
3、设置保存点,回滚事务到保存点/FUT_SWGL_BCD;
--建表并插入数据:
create table FUT_SWGL_BCD (c1 int,c2 varchar(10));
insert into FUT_SWGL_BCD values(1,'aa');
--查询表数据:
select * from FUT_SWGL_BCD;
--设置保存点:
savepoint A;
--再插入一条数据:
insert into FUT_SWGL_BCD values(2,'bb');
--回滚到保存点:
ROLLBACK TO SAVEPOINT A;
--再查询表数据:没有第二条插入的记录,步骤4的插入操作被回滚
select * from FUT_SWGL_BCD;
4、设置事务隔离级别,包括读提交、读未提交、可串行化/FUT_SWGL_GLJB
--在事务执行前设置事务的隔离级别为读提交:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
如果发现如上报错,则说明有些事务未提交,在运行中,所以这时我们需要手动提交一下就可以了:commit;
--建表并插入数据:
create table FUT_SWGL_GLJB (c1 int,c2 varchar(10));
insert into FUT_SWGL_GLJB values(1,'aa');
--新开一个查询会话窗口(记为会话2),查询表数据:返回结果集为空
select * from FUT_SWGL_GLJB;
--在原来的查询会话1中执行提交:
commit;
--在会话2中再次查询表数据:即事务1提交后事务2才能查询到事务1中插入的数据
select * from FUT_SWGL_GLJB;
--在事务执行前设置事务的隔离级别为读未提交:新建一个查询会话窗口3,在会话3中执行:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
--建表并插入数据:
create table FUT_SWGL_GLJB02(c1 int,c2 varchar(10));
insert into FUT_SWGL_GLJB02 values(1,'test1');
--新建一个查询会话窗口4,在会话4中执行:即读未提交隔离级下,事务4可以查询到事务3中未提交的数据
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
select * from FUT_SWGL_GLJB02;
--在事务执行前设置事务的隔离级别为读可串行化:新建一个查询会话窗口5,在会话5中执行:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
--建表并插入数据:
create table FUT_SWGL_GLJB03(c1 int,c2 varchar(10));
insert into FUT_SWGL_GLJB03 values(1,'test3aaa');
--新建一个查询会话窗口6,在会话6中执行:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
update FUT_SWGL_GLJB03 set c2='test3bbb' where c1=1;
--会话5中的事务5进行提交:
commit;
--在会话6中执行:查询结果为空
select * from FUT_SWGL_GLJB03;
5、多版本并发控制/FUT_SWGL_DBB
--管理员执行建表:
CREATE TABLE FUT_SWGL_DBB (C1 INT,C2 VARCHAR(20));
--再建一个存储过程向表FUT_SWGL_DBB插入数据:
create or replace procedure P_FUT_SWGL_DBB as declare i int;
begin
for i in 1 ..1000000 loop
insert into FUT_SWGL_DBB values(i,'test1');
if (i%5000)=0 then
commit;
end if;
end loop;
end;
--管理员新建一个用户,并授予该用户对表FUT_SWGL_DBB的操作权限:
create user U_FUT_SWGL_DBB identified by "123456789";
grant DBA to U_FUT_SWGL_DBB;
--用户U_FUT_SWGL_DBB登录数据库:
--管理员执行存储过程向FUT_SWGL_DBB插入1000000条数据:用户查询成功,说明写操作不阻塞同时执行的读操作。由于存储过程是每插入5000行执行一次提交操作,而用户只能查询到在执行查询的时刻已经提交的数据,因此每次查询到的数据条数都不一样,逐次增多,当存储过程执行完毕后,用户查询到的数据条数为1000000条
call P_FUT_SWGL_DBB;
在存储过程执行过程中,用户U_FUT_SWGL_DBB多次执行查询表FUT_SWGL_DBB的操作:
select count(*) from SYSDBA.FUT_SWGL_DBB;
--清除测试环境:
drop table FUT_SWGL_DBB;
drop procedure P_FUT_SWGL_DBB;
drop user U_FUT_SWGL_DBB cascade;