最近写了个多线程任务处理组件用来处理大批量的业务数据, 从业务监控数据中发现少量业务数据修改时一直处于等待状态,很明显是出现类似 for update 锁表,锁行的情况。
这种问题是系统设计(复杂的业务逻辑)导致的,暂时只能从数据库层次解决,因为修改系统设计比较复杂,也没有那么多时间。
解决思路:
1.查出锁住该表的会话id,serial#
SELECT object_name,machine,s.sid,s.serial#
FROM gv$locked_object l,dba_objects o,gv$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid;
SELECT o.object_name,s.sid, s.serial#
FROM v$lock l, dba_objects o, v$session s
WHERE l.id1 = o.object_id
AND l.sid = s.sid
AND o.object_name='SJ_AFFAIR';
2.kill掉该会话
alter system kill session 'sid, serial#';
3.代码临时优化:修改“初始表”数据时进行锁表尝试:for update nowait ,这个成本貌似有点高, 由于这种场景通常是数据异常场景,所以有监控就够了,因为7万票才偶尔出现一次,暂时不处理代码。
理论扫盲:
二、V$LOCK和V$LOCKED_OBJECT
查询锁表都会用到V$LOCK和V$LOCKED_OBJECT,但这两者不是相同的。我们先看看它们各自的主要字段:
1.v$lock
sid: 会话SID,通常与v$session关联。
type: 锁类型,TM表示表锁或DML锁,TX表示行锁或事务锁,UL表示用户锁。我们主要关注TX和TM两种型的锁其它均为系统锁,会很快自动释放,不用关注。行锁不会单独存,行级锁之前需要先加表级共享锁。
lmode: 会话保持的锁的模式。
0=None;1=Null;2=Row-S (SS,行级共享锁,其他对象只能查询这些数据行);3=Row-X (SX,行级排它锁,在提交前不允许做DML操作);4=Share(共享锁);5=S/Row-X (SSX,共享行级排它锁);6=Exclusive(排它锁)
ID1,ID2: ID1,ID2的取值含义根据type的取值而有所不同,对于TM 锁ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0;对于TX 锁ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER,ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
2.V$LOCKED_OBJECT
session_id: 会话id。通常与v$session关联。
object_id: 被锁对象标识。通常与dba_objects关联。
oracle_username: 登录oracle用户名。
os_user_name: 电脑用户名如:Administrator
locked_mode: 会话保持的锁的模式。
三、两者的区别
1.V$LOCKED_OBJECT只能报发生等待的表级锁,不能报发生等待的行级锁。
注:这句话是网上别人说的,暂时未验证,需慎重考虑。但是从我遇到的问题来看,似乎是正确的。只是我的问题已经无法重现,也就失去了验证它的机会。
2.v$locked_object包含的是当前DB中被锁住的OBJECT,而v$lock不仅包含用户的,还包括系统被锁住的object,即: V$LOCK>v$locked_object
分享到:
相关推荐
在Java开发中,当面临大批量数据导出到Excel文件时,可能会遇到内存溢出的问题。这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行...
MySQL 大批量数据插入优化方法 MySQL 大批量数据插入是指在短时间内将大量数据插入到 MySQL 数据库中,需要设计目标要求能支持平均每秒插入 1000 条数据以上。MySQL 提供了多种方法来实现大批量数据插入,包括使用...
在Java开发中,处理大批量数据时,合理利用线程池可以显著提高程序的执行效率和资源利用率。本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。...
本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...
在处理大量数据时,可以通过创建多个线程,每个线程负责处理一部分数据,然后并发提交。但要注意,并发提交可能引发锁竞争,导致性能下降,因此需要合理设置线程数量,并结合数据库的事务隔离级别来避免死锁和其他...
Why and How to Use Pandas with Large Data ,如何使用Pandas处理大批量数据,介绍了如何减少内存消耗,学习利用pandas进行大批量数据处理不错的参考资料。
总结,.NET大批量数据分页结合存储过程是解决大数据查询性能问题的有效方法。通过合理设计和优化存储过程,结合.NET中的数据访问技术,可以显著提高处理大量数据的响应速度,提升用户体验。同时,理解数据库的索引和...
在当前的IT领域,数据库管理系统(DBMS)是构建和维护数据存储的核心技术之一,尤其在处理大批量数据时,其性能优化显得尤为重要。本文旨在浅析在数据库管理系统中,如何有效进行大批量数据处理的优化技术。 首先,...
多线程异步加载大批量数据到Datagridview中,没次加载1000条数据。 引用DLL,调用方法: string sql = "select top {0} * from {2} where FItemID not in (select top {1} FItemID from {2})"; string tbName = ...
现在的数据库都要有良好的处理大批量数据的能力,这份ppt就介绍了如何设计一个具有处理大批量数据的数据库,设计合理的话亿万级的都完全没问题。另:文档非本人原创,觉得资源很好不自觉分享给大家。
通过上述分析,我们可以看到`SqlBulkCopy`在处理大批量数据导入任务时的强大能力。然而,为了最大限度地发挥其效能,还需注意以下几点: - **连接字符串的安全性**:应确保连接字符串中的敏感信息(如用户名、密码...
大批量数据处理技术 大批量数据处理技术,
场景:页面上传excle表,表中数据约10万,关键是后台逻辑输出数据的处理,避免出现空指针(空值) 目的:excle上传成功,数据入库成功。
在Excel处理大量数据时,传统的读取方法可能会面临性能瓶颈,尤其是在数据量达到10万条甚至更多时,常见的操作可能导致内存溢出,严重影响程序的稳定性和效率。为了解决这个问题,我们需要采用优化的策略来读取和...
传统的数据处理方式,例如直接使用参数化SQL或DataSet与DataAdapter,可能会在处理大批量数据时遇到性能瓶颈,因为每次操作都要对目标表进行多次独立的SQL交互。这种情况下,数据库的优化效果可能无法满足需求,尤其...
oracle分区技术,大批量数据操作复合分区
页面excle表导入大批量数据批量入库的边界值判断,假设excle表10万数据,5000为一批,10万是可以被5000整除的,那么此时整除的边界要进行处理(具体参见代码,以代码为列子阐述),否则会可能将会在最后一次出现null...