由于本人水平有限,文中有写得不对的地方请指正,本文的方法有些投机取巧,实在是没招的情况下可以酌情使用,如有侵权,请联系删除。
前几天接到一个需求,要在医嘱签署时对检验项目进行分方操作,分方规则调用第三方的接口获取(注:我们公司是做his系统的),我也是刚跳槽来到这家公司不久,有些代码还不熟悉。要对检验项目进行分方操作,我大概知道是对处方表met_ord_recipedetail(这是我们公司的处方表)的处方号进行修改,虽然找到"签署"按钮对应代码的入口,但里面的业务逻辑牵扯较多,再加上命名不规范以及多个功能封装在一个命名不严谨的方法里面,想要找到对处方表met_ord_recipedetail操作的那一小段代码逻辑,还是很费劲的。我最常用的方法是大胆猜测代码可能出现的位置,发现不管用,反正那天早上尝试了很多靠谱和不靠谱的方法,依旧没找到。中午去吃饭的路上脑袋里突然蹦出一个想法,既然我知道代码会修改处方表met_ord_recipedetail(insert或者update,select的不行),那我岂不是可以手工锁住该表,代码调用的地方肯定会堵塞,然后通过反编译调试工具dnSpy就能轻松找到要修改的代码位置。后面通过该方法,还真见鬼的几秒就给我找到了。
注意:千万不能在真实环境的数据库锁表,要在开发库上并且在人少使用系统的情况下操作
本文测试的环境:
1 oracle 19c数据库
2 dnSpy v6.1.8反编译调试工具
3 我们公司的客户端系统(有点low,直接通过sql的方式连接数据库的,不过管它的,能赚到钱就行)
废话不多说,跟着我一起来体验一把吧!
步骤1:打开我们公司的客户端系统,开好医嘱等待通过点击"签发"按钮签署医嘱,如图:
步骤2:打开反编译调试工具dnSpy,并附加客户端程序,如下图:
步骤3:在签发按钮代码入口打上断电,如图:
步骤4:点击签发按钮,进入断点如图:
步骤5:在数据库中手工锁表(当然也得会解锁)
我在pl-sql Developer工具中进行操作:
lock table met_ord_recipedetail in share mode nowait;
步骤6:点击反编译工具的继续按钮继续运行:
由于我们的系统是在UI线程进行数据库操作,所以很明显就看到系统被堵塞了,这时我们就可以点击反编译工具的"全部中断"按钮看代码的堆栈了,如下图:
从上图中我们就可以看到对应的堆栈了
步骤7:解锁表,oracle的使用rollback即可
好了,本文到此结束