实验要求
- 编写事务实例,分别使其成功提交和回滚,观察该事务对数据库的影响。
- 利用数据库管理系统提供的封锁机制解决并发操作带来的数据不一致情况。
实验操作
编写事务实例
事务是一系列数据库操作,是数据库应用程序的基本逻辑单元。无论有无故障,无论有多少事务并发执行,数据库系统都必须保证事务的正确执行一一事务中的所有操作要么全做,要么全不做。事务是并发控制的基本单位,也是数据库恢复的基本单位。
openGauss数据库支持的事务管理命令有启动、设置、提交、回滚事务。
启动事务(START TRANSACTION | BEGIN)
START TRANSACTION
[ {
ISOLATION LEVEL
{
READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ} |
{
READ WRITE | READ ONLY}}
[, ...] ];
设置事务(SET TRANSACTION)
{ SET [ LOCAL ] TRANSACTION | SET SESSION CHARACTERISTICS AS TRANSACTION }
{ ISOLATION LEVEL
{
READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ} |
{
READ WRITE | READ ONLY}}
[, ...];
提交事务
{ COMMIT | END } [ WORK | TRANSACTION ];
回滚事务
ROLLBACK [ WORK | TRANSACTION ];
回滚事例
连接数据库
su - omm
gs_om -t start
gsql -d postgres -p 26000 -r
启动事务
start transaction;
首先查看当前students
数据
select * from students;
添加一行数据
insert into students ;
values ('201825003','王五','男','1996-02-02',2017,'数学','ma');
再次查询数据
select * from students;
回滚事务:
ROLLBACK;
再次查询会发现回滚完成
提交事务
同样按照之前的步骤,先把事务打开并进行操作
start transaction;
select * from students;
insert into students
values ('201825003','赵六','男','1996-02-02',2017,'数学','ma');
select * from students;
提交事务
COMMIT TRANSACTION;
提交后查询发现事务已提交
封锁机制
加锁格式
LOCK [ TABLE ] {
[ ONLY ] name [, ...]| {name [ * ]} [, ...]}
[ IN {ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE} MODE ]
[ NOWAIT ];
为students表添加事务,然后加锁
start transaction;
lock students;
我们查看所有锁
SELECT * FROM pg_locks ;
提交事务后再次查询
commit transaction;
select * from pg_locks;