由于将子账户的功能下放给各个代理商,因此在企信通客户端添加了子账户以及充值的功能。开始测试的时候还挺顺利的,结果等连接上正式数据库的时候,就发现虽然能够正常的开户充值,但是短信却是发送不了的。
1、初步怀疑是生效的问题,看了下客户端的生效日志,发现有几个失败的,查看下原因,是因为接收生效指令的服务器的端口并没有开放的原因,满心欢喜的以为将端口放开后就能好用,结果发现依然不好用。于是……悲剧开始了。
2、第二天的时候,DBA说数据库发生死锁了,一顿查询,发现是客户端的充值语句跟后台程序的充值语句发生的,由于后台程序基本不能改动,因此修改死锁的这个重任就落在了我的头上。跟DBA一顿学习后,得出结论,我要更新一条提交一条就不会死锁了(可是这样就不在一个事务里了)
碎研究怎么在spring+hibernate的架构中手动的控制事务,使其能够在我希望的时候提交。
3、在上周,我本来以为这两个是独立的两个问题,基本时间都花在这两个问题上了。
关于生效,我一直以为是我的生效指令发送的问题或者是接收服务器接收时候的问题,由于这个思路,我又好一顿查看后台程序的生效日志,发现都是成功的,费解,十分的费解。
期间曾经想过,是不是自己的思路又问题,在哪里出了岔子,但是自己却一直在钻一条错误的牛角尖,但是也没想到其他的原因,于是每天都在生效的问题上死磕,整了一个礼拜也没结果,汗~
周一的时候小马哥本来说帮我看看代码,结果没空看,挪到周二看了。上午的时候就看,看到中午吃饭也没结果,下午接着看,又看了好久(期间还根据短信在后台程序的流转过程看了若干个程序日志),后来他问了我一句,是不是你生效的是提交前的内容?我恍然大悟。终于想到这个生效不成功跟死锁的产生都是一个原因:
我是在同一个方法里面调用的更新数据库的方法和向后台程序发送指令的方法,由于在同一个session里,我更新数据库的时候已经把相关的表加锁了,但是后台程序收到指令后又去更新(锁)这些相关的表,于是导致死锁了。
生效也是一样,由于插入的数据都还没用提交,后台程序这时候去生效,即使生效成功了,也是提交之前的数据。所以造成了一种生效失败必须从管理端生效的假象
找到原因,解决起来就能好很多,于是去找spring+hibernate的事务怎么处理。话说我现在也还是没整明白到底怎么回事,不过能在向后台程序发送指令之前提交了,死锁啊,生效啊这些就都应该是成功的了。
不过新的问题又产生了,就是我的插入/更新语句都是不只一条的,但是现在又不在同一个事务里面,一旦过程中出个什么差错,怎么办呢?
贴段代码,嘻嘻
貌似不应该把代码直接贴上来,毕竟是公司的东西嘛,又懒得改成能贴出来的东西,就这样吧。