数据库上机报告
一、实验目的
1.体会锁机制,通过同时启动两个会话,同时更新同一个数据,造成两个会话对
一个数据的争用,来体会锁机制(一个会话在等待)。
2.创造死锁,通过同时启动两个会话,分别对两个资源进行交叉加锁,来实现死
锁(Oracle 会检测出该死锁)
3.隔离级别,赋予事务不同的隔离级别,通过启动两个会话来体会并发。设计实
验用例,体现多事务的读写竞争。
4.索引:B 树索引,和基于函数的索引。
二、实验内容
1.写锁
在事务 1 对表 A 进行更新,不提交,在另一个事务 2 下再次对 A 表更新时不执行
操作,事务 2 被锁。
右侧事物 2 对 A 表的更新操作堵塞,出现写锁。
当事务 1 提交后,事务 2 才可以再次对同一个表进行操作。
2.死锁
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一
种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死
锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资
源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,
永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁。
存在两个表 A 和 B,创建两个事物,事物 1 和事物 2。
A ,B 表的内容如上图。
事物 1 更新 A 表,事物 2 更新 B 表,但不提交。
事物 1 请求对表 B 更新,事物 2 请求更新 A 表,这时原来在等待事物 2 释放 B
表的事物 1 会发生死锁。因为在等待一个不可能发生的事件。
3.隔离性
事务指定一个隔离级别,该隔离级别定义一个事务必须与由其他事务进行的资源
或数据更改相隔离的程度。隔离级别从允许的并发副作用(例如,脏读或虚拟读
取)的角度进行描述。
在事务 1 查看表 A 信息,在事务 2 中对表 A 进行更新
再回到事务 1 中查看表 A 信息发现事务 2 的更新并没有执行。
事务 2 提交后,表 1 再次查看表 A,才被修改成功。
4.B 树索引
将 HR 的原有的索引全部禁掉,新建自己的索引在 EMPLOYEES 表的 SALARY 上。
create index
EMPLOYEES_SAL on EMPLOYEES(SALARY);
新建索引 EMPLOYEES_SAL,并查询 SALARY 为 17000 的员工的 ID 和名字。
禁掉索引之后,再次查询。
对比可以看到两者的不同。
混合排序索引
create index desc_idx on EMPLOYEES(EMPLOYEE_ID DESC,FIRST_NAME ASC);
查询语句
select EMPLOYEE_ID from EMPLOYEES order by EMPLOYEE_ID DESC,FIRST_NAME
ASC;
禁掉索引,再次查询;
此时变成了全表扫描。
6.函数索引
新建函数索引
CREATE INDEX
EMPLOYEES_IDX ON "EMPLOYEES"(SUBSTR("FIRST_NAME",1,3))
查询语句
SELECT * FROM EMPLOYEES WHERE SUBSTR(FIRST_NAME,1,3) = 'Nee';
禁掉索引,再次查询:
对比两者的查询,索引更有优势。
三、总结
通过此次上机,学习了锁机制和索引,对课本更多了一些了解,但对其了解
不够深刻,仅限于完成实验,课下还要多学习。