快被系统性能逼疯了?你需要这份性能优化策略(4)
当多台任务服务器同时运行大额指令发送后台线程,即多个生产者线程并行更新数据库指令表时,数据库快照检测到存在数据库死锁,或通过db2evmon -db corpdb -evm DB2DETAILDEADLOCK>dlock.txt 生成死锁监控文件,快照或监控文件中存在deadlock的情况。 DB2数据库有自动解除死锁功能,死锁超时时间默认为10s,数据库会随机选择一个死锁事务kill掉。本案例由于是后台任务,所以用户感觉不到死锁;如果是联机交易,一个用户会发现交易失败,另一个用户交易成功,但是会感觉交易变慢。指令发送后台任务模型详见下一章节内容。 2)数据库死锁发生原理 两个不同的数据库事务使用排它锁锁住了同一张表的不同行记录,并且互相等待读取对方锁住的行记录。 3)导致死锁的可能原因 全表扫描、大事务、事务之间对死锁访问顺序交叉等。 4)死锁问题排查过程 Step1:分析数据库快照和死锁监控日志,查看导致死锁的SQL,定位问题SQL。 Step2:问题SQL不存在事务之间对死锁访问顺序交叉的情况,当时尚不清楚程序中的全表扫描、大事务可能会导致死锁,因此做了以下实验:
UPDATE ( SELECT BP_SRVR_IP FROM ${tableName} WHERE TSK_STAT='TODO' AND ( BP_SRVR_IP IS OR BP_SRVR_IP='') AND PRTY =? AND eff_tm <= CURRENT TIMESTAMP FETCH FIRST 50 ROWS ONLY WITH RS) t SET BP_SRVR_IP=?
Step3:实验发现查询SQL增加with RS隔离级别,查询效率会更高。当A事务已对记录R加X锁,B事务扫描到R记录时,如果是CS隔离级别,B事务会自动退出,返回空结果集;如果是RS隔离级别,B事务会等待A事务完成后,跳过R记录,对符合条件的R+1记录加X锁。 Step4:PRTY字段增加索引,没有出现死锁问题;或者不加索引,维持全表扫描不变,大事务改成小事务后,也没有出现死锁问题。 5)两点经验
七、后续提升网银系统性能备选方法 1、增加缓存的使用
2、精简BP日志。删除交易访问记录日志表的操作。 3、合并、精简接口数量,前端缓存数据。 【编辑推荐】
点赞 0 (编辑:ASP站长网) |