设为首页 收藏本站
查看: 1097|回复: 0

[经验分享] Oracle OCP笔记(18)并发与锁

[复制链接]

尚未签到

发表于 2015-11-9 10:14:48 | 显示全部楼层 |阅读模式
Oracle OCP笔记(18)并发与锁


一.锁定机制
    在任何多用户数据库应用程序中,最终免不了会出现两个用户希望同时使用同一行的情况。借助表和记录的锁定机制,可以实现并发访问的串行化。


二.共享锁与排他锁(share lock, exclusive lock)
    排他锁:
    在指定记录上请求排他锁的第一个会话会得到排他锁,其他请求对该记录进行写访问的会话则必须等待.虽然这行已通过锁定会话进行了更新,但是对其进行读访问是被允许的(而且经常会出现这种情况),并且这些读操作会涉及撤销数据的使用,从而确保读会话并不会看到任何未被提交的变化.
    对于一行或一个表上的排他锁来说,每次只能有一个会话可以获得这个排他锁,不过许多会话可以同时获得相同对象上的共享锁。


    共享锁
    在一行上设置共享锁毫无意义,锁定一行的唯一目的就是不允许其他会话更改它。共享锁被置于整个表上。同时许多会话可以获得同一个表上的共享锁。
    在一个表上放置共享锁的目的是为了防止另一个会话获得这个表上的排他锁(在已存在共享锁的情况下无法再获得排他锁).
    在表上放置排他锁时需要执行DDL语句,如果其他人和会话已经在一个表上放置了共享锁,就无法修改某个对象的语句(例如删除这个表的一列).
    为了在行上执行DML语句,当前会话必须获取待更改行上的排他锁以及包含这些行的表上的共享锁,如果另一个会话已经获取了待更改行上的排他锁,那么当前会话将被挂起,直至使用COMMIT或ROLLBACK命令解除锁定。如果另一个会话已经获取了表上的共享锁以及其他行上的排他锁,就不存在任何问题。
    一个表上的排他锁也是允许的,但是,除非DDL语句要求这么做,默认锁定机制是不锁定整个表。
    所有DML语句至少都需要两种锁定: 受影响记录上的排他锁,以及包含受影响记录的表上的共享锁。排他锁能够防止其他会话干预指定的行,而共享锁则能够阻止其他会话使用DDL语句修改表的定义。这两种锁定会被自动请求。如果某条DML语句在指定记录上无法获取所需的排他锁,那么这条语句会被挂起直至获得所需的排他锁。
    执行DDL命令需要使用所涉及对象上的排他锁,只有在针对指定表的所有DML事务结束,且行上的排他锁以及表上的共享锁都被解除之后,才可以获得执行DDL命令所需的排他锁。任何DDL语句所需要的排他锁都是被自动请求的。但是,如果无法获取所需的排他锁(通常是因为其他会话已经获得用于DML语句的共享锁),那么DDL语句就会由于错误立即终止。


   
三.监视锁定争用.


-- 查看锁定的会话和锁定对象
select s.sid,s.serial#,s.lockwait,s.status,s.schemaname,s.machine,s.terminal,s.osuser,s.program,s.module,s.action,s.logon_time,
       l.oracle_username,l.os_user_name,l.locked_mode,o.owner,o.object_name,o.object_type,o.status
  from v$session s,
       v$locked_object l,
       dba_objects o
where s.sid = l.session_id
   and l.object_id = o.object_id;


-- 查看阻塞与等待锁的会话
select * from dba_waiters;


-- 查看锁定的会话和锁定对象(阻塞的会话)
select s.sid,s.serial#,s.lockwait,s.status,s.schemaname,s.machine,s.terminal,s.osuser,s.program,s.module,s.action,s.logon_time,
       l.oracle_username,l.os_user_name,l.locked_mode,o.owner,o.object_name,o.object_type,o.status,
       'alter system kill session '||''''|| s.sid||','||s.serial#||''''||';' kill_session_sql   
  from v$session s,
       v$locked_object l,
       dba_objects o
where s.sid = l.session_id
   and l.object_id = o.object_id
   and s.sid in (select holding_session from dba_waiters);


-- 查看锁定的会话和锁定对象(阻塞的会话),RAC环境
select s.sid,s.serial#,s.lockwait,s.status,s.schemaname,s.machine,s.terminal,s.osuser,s.program,s.module,s.action,s.logon_time,
       l.oracle_username,l.os_user_name,l.locked_mode,o.owner,o.object_name,o.object_type,o.status,
       'alter system kill session '||''''|| s.sid||','||s.serial#||''''||';' kill_session_sql   
  from gv$session s,
       gv$locked_object l,
       dba_objects o
where s.sid = l.session_id
   and l.object_id = o.object_id
   and s.sid in (select holding_session from dba_waiters);


-- 查看正在执行的SQL语句(排除当前的语句)
select s.sid,s.serial#,s.lockwait,s.status,s.schemaname,s.machine,s.terminal,s.osuser,
       s.program,s.module,s.action,s.logon_time,t.sql_id,t.piece,t.sql_text
  from v$session s,
       v$sqltext t
where s.sql_address = t.address
   and s.sql_hash_value = t.hash_value
   and s.status = 'ACTIVE'
   and s.sid <> userenv('SID') --(select sid from v$mystat where rownum = 1)
order by s.sid,t.sql_id,t.piece;


-- 查看正在执行的SQL语句(排除当前的语句)
select s.sid,s.serial#,s.lockwait,s.status,s.schemaname,s.machine,s.terminal,s.osuser,
       s.program,s.module,s.action,s.logon_time,a.sql_text,a.sql_fulltext
  from v$session s,
       v$sqlarea a
where s.sql_address = a.address
   and s.sql_hash_value = a.hash_value
   and s.status = 'ACTIVE'
   and s.sid <> userenv('SID') --(select sid from v$mystat where rownum = 1)
order by s.sid


-- 杀掉长期锁定对象的会话
alter system kill session 'sid,serial#' immediate;


四.死锁(deadlock)
    两个会话相互阻塞,这两个会话都被挂起,每个会话都在等待另一个会话释放锁定,这种场景被称为死锁(deadlock)。
    死锁是由不合理的程序设计导致的,发生死锁问题的原因是程序试图获得锁定对象的顺序不一致导致的。数据库系统能自动检测到死锁。         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-136918-1-1.html 上篇帖子: Ocp: Oracle 10g New Features For Administrators : Study Guide 下篇帖子: UML中的 SRP、OCP、LSP、DIP、CARP的中英文全称和意义
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表