多进程操作sqlite的数据同步问题
背景最近写在多进程任务里操作sqlite的时候,发现数据同步是个头疼的问题。因为sqlite本身并不支持存储过程(procedure),它本身也没有可以单独调用对数据表的锁(可能是我没找到,如果有人知道还请赐教)。这就意味着在执行一系列修改数据库命令的时候会被打断,造成最后存在数据库中的数据失真。
假设执行了第一种顺序,因为数据不同步那么就可能存在支出300元的时候,另一个进程不知道,而只知道已经存入银行了200,然后又存入100,那么执行完毕后银行里剩下400元。账户就无缘无故多了300元的数据(其他顺序产生的可能请自己列举)。这就需要一个能够保证程序能够正确执行的机制。这个例子也许会让人感觉不太可能发生,因为实际在用的银行系统在设计时已经考虑了数据同步问题。那么再举一个比较容易发生和理解的例子。在大型QQ群里报数。有兴趣的可以找个QQ群尝试一下,看看能不能够快速地次序不乱地完成报数。 分析以上的问题都产生于自于一个最基本的问题,就是数据同步的问题。一旦数据在任何地方产生都是瞬时完成的,就根本不需要考虑这个问题了。但是现实往往不是理想状态的,由于数据传输时候中转路由器可能产生的拥堵,会导致先发出的数据信号后执行,而先产生的数据后抵达。而且sqlite的锁机制也会导致这种现象发生。 总结延时利用得好是可以解决很多问题的。但是如果利用不好就容易陷入无限等待的状态中。目前利用这个方法运行的程序已经稳定地跑了几十万次了,而且运行状况出乎意料的好。 PS.可能有人要问,为什么要用并不完善的sqlite来做数据库。这个不是这篇文章需要讨论的问题,但是我要说一句,任何问题都会有产生的背景,如果你没选择的时候,只能想办法去解决问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |