借助于记录和表锁定机制,我们可以实现并发访问的串行化。锁定是完全自动的。
1、 排他锁和共享锁
排他锁:只有在使用commit或rollback命令结束事务后,锁定才会被解除的锁定。
在指定记录上请求排他锁的第一个会话得到这个锁定,其他请求对该记录进行些访问的会话则必须等待。
共享锁:许多会话可以同时获得相同对象上的共享锁。
共享锁被置于整个表上,同时许多会话可以获得同一个表上的共享锁。在一个表上设置共享锁的目的是为了防止另外一个会话获得这个表上的共享锁。
2、 DML LOCK AND DDL LOCK
DML LOCK需要获得受影响记录上的排他锁,以及包含所影响记录的表上的共享锁。
DDL LOCK需要获得所涉及对象上的排他锁。
例子:
|
1使用sqlplus,创建表,插入数据。 system@ORCL> create table t2(c1 number); 表已创建。 system@ORCL> insert into t2 values(1); 已创建 1 行。 2再次使用sqlplus,打开另一个会话。 3在第一个会话执行DML system@ORCL> update t2 set c1=2 where c1=1; 已更新 1 行。 4 在第二个会话执行DDL,DDL执行会失败。 system@ORCL> alter table t2 add (c2 date); alter table t2 add (c2 date) * 第 1 行出现错误: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 5 第一个会话提交 system@ORCL> commit; 提交完成。 6 第二个会话重新执行DDL。 system@ORCL> alter table t2 add (c2 date); 表已更改。 7 第一个会话锁定整个表。 system@ORCL> lock table t2 in exclusive mode; 表已锁定。 8 第二个会话插入记录,此时会话将被挂起。 system@ORCL> insert into t2 values(1,sysdate);
9 第一个会话提交 system@ORCL> commit;
提交完成。 10第二个会话提交 system@ORCL> commit;
提交完成。 |
3、 排队机制
请求锁定需要排队。
排队机制:使用锁定的会话解除锁定时,下一个会话又将在记录或对象上放置锁定,以此类推。
避免排队的唯一方法是使用SELECT … FOR UPDATE 命令的 WAIT 和 NOWAIT 子句。
例子
|
1第一个会话 system@ORCL> select * from t2 for update;
C1 C2 ---------- ----------------- 2 1 26-04-12:16:25:11 |
2第二个会话
system@ORCL> select * from t2 for update nowait;
select * from t2 for update nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
3 第二个会话
system@ORCL> select * from t2 for update wait 10;
select * from t2 for update wait 10
*
第 1 行出现错误:
ORA-30006: 资源已被占用; 执行操作时出现 WAIT 超时
4、 锁定争用
当某个会话请求一条记录或一个对象上的锁定,但是由于其他会话已经获取了该记录或对象的排他锁而无法获得锁定时,这个会话将挂起。这种现象叫锁定争用。
锁定争用会导致数据库性能急剧恶化,应避免锁定争用。
死锁是锁定争用的特殊情况,并且由数据库自动解决。
4.1 锁定争用的原因
。应用程序业务设计问题。
。运行时间很长的事务。
。用户更新某条数据但未更新。
。批量处理进程在被不恰当地设计为长事务。
。第三方用户产品会带来过高的锁定级别。
。重复读取。
4.2 检测锁定争用
使用database control 工具查看,需要关心的是blocking locks(阻塞锁定)
4.3 解决锁定争用
使用database control 工具或alter system kill session 命令终止一个会话。
5、 死锁
死锁:两个会话相互阻塞,这两个会话都被挂起,每个会话都在等待另一个会话释放其锁定。
死锁是一种程序设计错误。
除了报告死锁的发生之外,DBA不需要完成针对死锁的操作。死锁问题是由oracle数据库自动解决的,oracle自身会通过回滚导致死锁的某条语句来解决死锁问题。
出现死锁产生的消息“ORA-0060 DEADLOCK DETECTED”
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9537053/viewspace-722391/ ,如需转载,请注明出处,否则将追究法律责任。