暂无图片
分享
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
handhead

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

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

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

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

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

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

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

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

暂无图片 评论
暂无图片 有用 0
handhead
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏