多进程操作sqlite的数据同步问题

背景

最近写在多进程任务里操作sqlite的时候,发现数据同步是个头疼的问题。因为sqlite本身并不支持存储过程(procedure),它本身也没有可以单独调用对数据表的锁(可能是我没找到,如果有人知道还请赐教)。这就意味着在执行一系列修改数据库命令的时候会被打断,造成最后存在数据库中的数据失真。
比如说,你的银行账户里还剩100元,你存入200元,支出300元,存入100元,假设它们都是几乎同时发生的(在数据延时足够大的时候或者数据操作的耗时足够大的时候,操作的耗时是可以忽略不计的)。那么你的银行账户里还剩多少钱?如果顺序执行,那么这个事情的结果必然是还剩100元。但是在操作sqlite数据库的时候中并非总是如此,它可能存在几种执行的顺序如下:

  1. 存入200->支出300->存入100
  2. 存入200->存入100->支出300
  3. 存入100->支出300->存入200
  4. 存入100->存入200->支出300
  5. 支出300->存入100->存入200
  6. 支出300->存入200->存入100

假设执行了第一种顺序,因为数据不同步那么就可能存在支出300元的时候,另一个进程不知道,而只知道已经存入银行了200,然后又存入100,那么执行完毕后银行里剩下400元。账户就无缘无故多了300元的数据(其他顺序产生的可能请自己列举)。这就需要一个能够保证程序能够正确执行的机制。这个例子也许会让人感觉不太可能发生,因为实际在用的银行系统在设计时已经考虑了数据同步问题。那么再举一个比较容易发生和理解的例子。在大型QQ群里报数。有兴趣的可以找个QQ群尝试一下,看

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值