最近写了个多线程任务处理组件用来处理大批量的业务数据, 从业务监控数据中发现少量业务数据修改时一直处于等待状态,很明显是出现类似 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
分享到:
相关推荐
解决大批量数据导出Excel产生内存溢出的方案
JAVA使用线程池查询大批量数据
java解决大批量数据导出Excel产生内存溢出的方案
Why and How to Use Pandas with Large Data ,如何使用Pandas处理大批量数据,介绍了如何减少内存消耗,学习利用pandas进行大批量数据处理不错的参考资料。
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
现在的数据库都要有良好的处理大批量数据的能力,这份ppt就介绍了如何设计一个具有处理大批量数据的数据库,设计合理的话亿万级的都完全没问题。另:文档非本人原创,觉得资源很好不自觉分享给大家。
场景:页面上传excle表,表中数据约10万,关键是后台逻辑输出数据的处理,避免出现空指针(空值) 目的:excle上传成功,数据入库成功。
多线程异步加载大批量数据到Datagridview中,没次加载1000条数据。 引用DLL,调用方法: string sql = "select top {0} * from {2} where FItemID not in (select top {1} FItemID from {2})"; string tbName = ...
大批量数据处理技术 大批量数据处理技术,
大批量存储数据和优化 大批量存储数据和优化 大批量存储数据和优化
oracle分区技术,大批量数据操作复合分区
页面excle表导入大批量数据批量入库的边界值判断,假设excle表10万数据,5000为一批,10万是可以被5000整除的,那么此时整除的边界要进行处理(具体参见代码,以代码为列子阐述),否则会可能将会在最后一次出现null...
再导入大批量数据的时候,使用它,可以让你更轻松
oracle分区技术-大批量数据操作,优化处理,大数据量的处理
需求:需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上 方法:mysql批量数据插入方法及性能参考
前段时间上传了一个fluent大批量数据处理的代码,经过同学运行发现,当fluent导出数据量到excel时,因为超过百兆太大不支持,于是稍微改写了一下,这样可以选择 以dat格式或则txt格式储存,然后在运用该段代码处理...
可以大批量地处理数据的导入,并将无关行列删除,再对数据中的字符串、数字格式统一,与拼接,并与另一个xls文档中的数据进行比较,是一个不错的代码。
.net 分页,存储过程,大量数据。。。提高响应速度。。。