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
死锁:两个会话相互持有对方持有的资源
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战