暂无图片
分享
handhead
2020-02-13
表上有联合主键,更新时未走(主键)索引,会造成enq: TX - row lock contention模型为6的锁争用吗?,怎么解决锁的问题
暂无图片 5M

说明:表中TBL_TallyABC存在联合主键WorkDate,ReceiveDate ,StatDate,BillCycle,SettlementOrgID,StatType.
以下SQL的执行计划是全表扫描
update TBL_TallyABC set Count = Count + 1,Amount = Amount + :1
where WorkDate = :2 and ReceiveDate = :3 and StatDate = :4 and
BillCycle = :5 and SettlementOrgID = :6 and StatType = :7
发现这个SQL造成数据库那个时段75%的enq: TX - row lock contention,且锁的模型是6 是什么原因呢,怎样减少enq: TX - row lock contention。执行计划.PNG

收藏
分享
6条回答
默认
最新
王小那个鑫

update只要更新到同一行,就会造成行锁吧,应该是和走那个索引无关的,解决锁的问题,只有更新完commit后才能解锁(人工干预就是kill会话,但是如果没有commit,会回滚,如果数据量比较大,可能会造成undo不足或者影响性能,kill会话前一定要考虑清楚)。还有就是可以考虑做下业务调整,这种更新操作,可不可以放到非业务高峰期来进行。个人意见,可以参考下

暂无图片 评论
暂无图片 有用 0
打赏 0
handhead

update后面的条件筛选出来的记录是唯一的,怎么会造成更新到同一行呢?

暂无图片 评论
暂无图片 有用 0
打赏 0
刘晨

您可以看下执行计划中,显示逐渐索引字段执行了INTERNAL_FUNCTION,应该是Oracle进行了隐式转换,不能使用索引,进而导致执行慢,大量同行请求进来的时候,行锁不能释放,导致row lock contention增加。因此,可能解决了隐式转换的问题,row lock contention就可以下降了。

P.S. 很可能是你的字段定义,VARCHAR2和NUMBER的关系,导致了隐式转换,可以看下。

暂无图片 评论
暂无图片 有用 0
打赏 0
handhead

是的,说回来了,也就是说不走索引,走了全表扫描造成执行效率低,导致的enq: TX - row lock contention增加。
并不是由于多个sql操作了一条记录产生的enq: TX - row lock contention,对吧

暂无图片 评论
暂无图片 有用 0
打赏 0
刘晨

enq: TX - row lock contention,是对相同行操作产生的行锁争用,我的意思是之所以会产生争用,很可能是因为全表扫描,对行锁的持有时间增加了,才导致的,如果SQL高效,很快释放了行锁,即使多个SQL操作同一行记录,并不会产生争用,因此,您说的后半句,不是很准确。

暂无图片 评论
暂无图片 有用 0
打赏 0
handhead
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
执行PKG_AI_DEAL_NR包中main存储过程,同步数据,怎么执行?
回答 2
在pl/sql中以程序块方式运行beginPKGAIDEALNR.main(如果有参数就填);end;/在sqlplus中以命令行方式运行EXECPKGAIDEALNR.main(如果有参数就填);
Oracle 12c导出的dmp怎么导入11g啊,或者导出低版本的dmp?
回答 2
已采纳
12cexpdp命令行加入version想导入的数据库版本号
Oracle报错:ORA-01000 : 超出打开游标的最大数
回答 2
已采纳
同楼上,也可以参考Typically,inJava,whenanobjectgoesoutofscope,itisautomaticallygarbagecollected,buttheJavaspe
Oracle 一个服务器上,两个sid用同一个端口,有什么问题吗?
回答 3
需要从SID上区分数据库实例,不推荐启动多套实例的方式运行数据库,多实例会出现资源争抢的情况,可以采用Oracle多租用户环境(MultitenantEnvironment)模式来实现
救命!!!4TB的大表新增字段加了一晚上没完成
回答 3
已采纳
根据Oracle官方文档,直到Oracle12.1.0.1的NewFeatureGuide才有下面描述:Thedefaultvaluesofcolumnsaremaintainedinthedatad
最近用户总说连接到oracle后,长时间没操作,就提示连接断开,怎么设置?
回答 4
应该是防火墙超时,对长连接进行断开了
es怎么拉取慢sql
回答 1
Elasticsearch提供了慢查询日志,你可以通过配置elasticsearch.yml文件中的参数来启用。在elasticsearch.yml中添加以下配置:index.search.slowl
Oracle 插入数据的经常报错”0ra-01688,执行insert脚本,插入的数据只有7g左右,CALCDATA表空间剩50多个g,temp表空间也有700多个g,表空间都是够的,这是什么问题?
回答 2
检查下是不是这个表空间是不是磁盘碎片哦
rac恢复到单机疑问
回答 1
2个节点日志都需要啊。两边日志内容是不一样的
Oracle rac 的scan IP在两台机器上都有,这是正常的吗?
回答 5
已采纳
正常情况下不存在哈,正常是依附在某个网卡上面,如举例就是scanip和publicip网卡是同一个!   不过这个问题也没啥,只要确保scan的监听能正常连接就行。&nb