关于业务代码过于复杂可能引发数据库锁表问题的一些思考

有些时候业务场景比较复杂,我们在一个接口中会处理很多业务逻辑,这些业务逻辑可能涉及到几张表数据的插入以及更新,这时候可能引发锁表问题(查询倒是不会引发锁表问题),面对这个既定发生的锁表问题的事实,要怎么去解决呢,在数据库层面,一开始我去百度会百度出很多sql语句,大致都是一些查询锁表and终结锁表的一些语句,个人没有对这个深究,也感觉不太靠谱,下面提供的思路是从业务代码上去规避锁表问题。

思路:在程序加载的初始阶段servlet init 时,把业务场景中需要的数据全部load出来,然后组建一个数据词典(map,键一般为这些业务数据共同的一个主键,值为所有的对应业务数据)

大致情况如上图所示,关于程序启动一开始就去加载这些数据,推荐使用@PostConstruct注解

这种方式会在一开始加载时也会注入dao。

另一种方式就是实现Servlet监听器接口ServletContextListener,但是有弊端,一是我在启动时此时这时候dao没有注入,需要通过另外的方式去注入这些dao

另外还有一个弊端,如果你是通过tomcat启动,然后再以这种方式去实现,会出现servlet-api的jar包冲突,我当时并没有解决这个问题。

接下来我们需要建一个缓存的接口,接口中的方法的作用就是替代我们与数据库直接打交道的一些xml中的sql语句

其中,查询语句我们只需要拿缓存中的数据,而insert以及update,我们需要把sql作为返回值返回出来,同时更改缓存中的内容,如下图:

返回的sql会放入队列中,然后使用定时器,比如说定时5分钟去执行,这样就会保持数据的一致

具体做法就是以上这些。over!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值