锁概念基础
Oracle数据库的锁类型
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowaitspecified.
原因分析
阻塞
定义:
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
INSERT
UPDATE 和DELETE
Select …for update
死锁-deadlock
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
3:如果用户2此时对A表作update则会发生阻塞,需要等到用户1的事务结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
表1Oracle的TM锁类型 | |||
锁 模式 | 锁描述 | 解释 | SQL操作 |
0 | none | ||
1 | NULL | 空 | Select |
2 | SS(Row-S) | 行级共享锁,其他对象只能查询这些数据行 |
Select for update、Lock forupdate、Lock row share |
3 | SX(Row-X) | 行级排它锁,在提交前不允许做DML操作 |
Insert、Update、Delete、Lock rowshare |
4 | S(Share) | 共享锁 | Create index、Lockshare |
5 | SSX(S/Row-X) | 共享行级排它锁 | Lock share rowexclusive |
6 | X(Exclusive) | 排它锁 |
Alter table、Drop able、Dropindex、Truncate table 、Lock exclusive |
1.
2.其它相关视图说明
视图名 | 描述 | 主要字段说明 |
v$session | 查询会话的信息和锁的信息。 |
sid,serial#:表示会话信息。 program:表示会话的应用程序信息。 row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。 lockwait:该会话等待的锁的地址,与v$lock的kaddr对应. |
v$session_wait | 查询等待的会话信息。 |
sid:表示持有锁的会话信息。 Seconds_in_wait:表示等待持续的时间信息 Event:表示会话等待的事件,锁等于enqueue |
dba_locks | 对v$lock的格式化视图。 |
Session_id:和v$lock中的Sid对应。 Lock_type:和v$lock中的type对应。 Lock_ID1:和v$lock中的ID1对应。 Mode_held,mode_requested:和v$lock中 的lmode,request相对应。 |
v$locked_object | 只包含DML的锁信息,包括回滚段和会话信息。 |
Xidusn,xidslot,xidsqn:表示回滚段信息。和 v$transaction相关联。 Object_id:表示被锁对象标识。 Session_id:表示持有锁的会话信息。 Locked_mode:表示会话等待的锁模式的信 息,和v$lock中的lmode一致。 |
select * from v$lock;
select * from v$lock where block=1;
2.查询被锁的对象
select * from v$locked_object;
3.查询阻塞
查被阻塞的会话
select * from v$lock where lmode=0 and type in ('TM','TX');
查阻塞别的会话锁
select * from v$lock where lmode>0 and type in('TM','TX');
4.查询数据库正在等待锁的进程
select * from v$session where lockwait is not null;
5.查询会话之间锁等待的关系
select
where
select * from v$session_wait where event='enqueue';