1.oracle性能优化之锁

1.前言

oralce的性能优化主要定位于三层:SQL层,会话层,以及系统层

sql层:
  - 如果能从定位到sql,就不要从会话层面分析
  工具执行计划,10053,10046....

会话层:
  - 如果能定位到会话,就不要从系统层面分析
  v$session,v$sesstat,v$session_wait,v$sql,v$lock,sql_trace

系统层
  如果无法定位任何性能问题,从系统层面入手
  AWR(staspack),os tools(top,iostat)

2.Oracle的锁

  oracle的锁主要分为两类:

  Enqueues  ----队列类型的锁,通常和业务相关的

  Latches  -----系统资源方面的锁,比如内存结构,SQL解析

3.锁的原则

1.只有被修改时,行才会被锁定。
2.当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级
3.当某行被修改时,它将阻塞别人对它的修改。
4.当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改
5.读永远不会阻止写。
6.读不会阻塞写,但有唯一的一个例外,就是select...forupdate
7.写永远不会阻塞读。
8.当一行被修改后,Oracle通过回滚段提供给数据的一致性读。

4.锁的类型

 Oracle所得类型有很多中,但是我们最常见的两种锁是TM和TX

 TM表锁:发生在insert,update,delete以及select ..... for update操作时,目标是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。

 TX锁 事务锁(行锁) 对于正在修改的数据,阻止其它会话进行修改

5.演示

  这里有个update过程中的出现的锁

  

  这里使用了v$lock这个视图进行查看的,

  sid可以看成会话id,可以和v$sesssion关联

  type表示锁的类型,这里就主要看TM和TX锁了,

  block 0:表示未阻塞  其他 1: 表示阻塞其他线程了

  request 请求获取的数据的状态 0表示锁, 1-6表示锁的状态

6.与v$lock相关的视图说明

视图名 描述 主要字段说明
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

  

 

 

 

 

 

 

#select sid,EVENT from V$SESSION_WAIT where sid in (29,31);

7.锁模式

锁模式 锁定的sql 排斥的模式 允许的DML
2 lock table t in row share mode; 6 select/insert/update/delete/for update
3 lock table t in row exclusive mode; 4,5,6 select/insert/update/delete/for update 
4 lock table t in share mode; 3,5,6 select
5 lock table t in share row exclusive mode; 3,4,5,6 select
6 lock table t in exclusive mode; 2,3,4,5,6

select

 

 

 

 

 

 

 

RI锁 ---基于引用关系的锁定

    当对具有主外键关系的表做DML操作时,锁定不单单发生在操作表上,相应的引用表上也可能加上相应的锁定。

复制代码
SQL> create table p(id int primary key);

Table created.

SQL> create table c(id references p(id));

Table created.

  SQL> insert into p values(1);

  1 row created.

复制代码

这里创建了两个表p是主表,c是从表,向主表里面插入一条数据

SQL> select sid,type,ID1,id2,lmode,request,block from v$lock where TYPE in ('TM','TX') order by  1,2;

       SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
        29 TM      23804          0          3          0          0
        29 TM      23806          0          2          0          0
        29 TX     196614        705          6          0          0
SQL> select object_name from dba_objects where object_id in(23804,23806);

OBJECT_NAME
--------------------------------------------------------------------------------
P
C

可以看到当在主表进行插入数据的时候,不仅会在主表上面加上TM,TX锁,同时会在从表上加上表级锁来防止从表被删除

delete和update参考:https://blog.csdn.net/qq_34556414/article/details/82759635

死锁:两个会话相互持有对方持有的资源

 

posted on   太白金星有点烦  阅读(218)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示