Q2:1、某会话执行 UPDATE employees SET salary = 10000 WHERE id = 1; 语句。在执行该操作时,该会话除了在数据行上获得 TX(事务)锁之外,还会自动获取什么级别的锁?
数据库级别的排他锁 (DB Lock)
表级别的共享锁 (S Lock)
表级别的排他意向锁 (TM锁) (或简称为表锁)
数据字典锁 (DDL Lock)
Q3:2、关于 Oracle 数据库中的死锁(Deadlock),下列描述正确的是?
Oracle 不会主动检测死锁,发生死锁后只能等待 DBA 手动重启数据库实例来恢复
Oracle 在检测到死锁后,会随机选择其中一个被阻塞的会话将其回滚
Oracle 使用有向图等算法检测死锁,检测到后会选择一个代价较小的事务进行回滚,并向应用抛出 ORA-00060 错误,同时会在告警日志(Alert Log)中记录
死锁只会在行级锁(TX)之间发生,涉及表级锁(TM)时不会产生死锁
Q4:3、某 DBA 正在排查性能问题,发现大量会话都阻塞在等待事件 enq: TM - contention 上。根据 Oracle 锁的兼容性原理,这种情况最可能的场景是?
多个会话正在并发执行 SELECT ... FOR UPDATE 语句
大量会话同时执行不带条件的全表 DELETE 操作
一个会话正在对某张大表执行 TRUNCATE TABLE 或 ALTER TABLE 等 DDL 操作,同时有其他会话对该表执行 DML(增删改)操作
数据库的 UNDO 表空间不足,无法生成读一致性所需的 UNDO 数据
Q5:4、在按照《Oracle数据库监控报警常见问题处理手册》处理行锁报警时,如果确认需要执行 alter system kill session sid,serial#,@inst_id immediate; 命令来杀掉阻塞会话,根据该流程明确的操作管控要求,在输入该 Kill 命令之前,必不可少的先决动作是什么?
必须先执行 alter system flush buffer_cache; 清理缓存,以防 Kill 后数据丢失
必须先开启数据库的闪回(Flashback)功能,以便 Kill 错误后可以回退
必须获得应用维护人员的邮件授权以及数据库团队负责人的授权
必须先将该数据库实例切换到 Mount 状态,再进行 Kill 操作
Q6:5、在处理完 enq: TX - row lock contention 的紧急阻塞,通过 Kill 会话恢复了业务后,需要定位历史上引发该行锁争用最频繁的 SQL 语句,以便告知应用开发团队进行根源优化。根据报警流程,此时应该执行的操作和查询的视图是?
直接执行 SOP 步骤(1)的 SQL 查询,因为 gv$session 会保留历史被阻塞的记录,按 SQL_ID 计数即可
执行 SOP 步骤(6)的 SQL 查询,通过 gv$active_session_history 视图,并指定 sample_time >= sysdate - interval '时间范围' minute,按 SQL_ID 分组统计出现次数(count(*) 降序)来锁定高频问题 SQL
查询 gv$sql_monitor 视图,根据执行时间长短直接定位消耗最长的 SQL 语句
直接查询 v$lock 视图,找出曾经持有排他锁的会话的历史记录