背景
最近写在多进程任务里操作sqlite的时候,发现数据同步是个头疼的问题。因为sqlite本身并不支持存储过程(procedure),它本身也没有可以单独调用对数据表的锁(可能是我没找到,如果有人知道还请赐教)。这就意味着在执行一系列修改数据库命令的时候会被打断,造成最后存在数据库中的数据失真。
比如说,你的银行账户里还剩100元,你存入200元,支出300元,存入100元,假设它们都是几乎同时发生的(在数据延时足够大的时候或者数据操作的耗时足够大的时候,操作的耗时是可以忽略不计的)。那么你的银行账户里还剩多少钱?如果顺序执行,那么这个事情的结果必然是还剩100元。但是在操作sqlite数据库的时候中并非总是如此,它可能存在几种执行的顺序如下:
- 存入200->支出300->存入100
- 存入200->存入100->支出300
- 存入100->支出300->存入200
- 存入100->存入200->支出300
- 支出300->存入100->存入200
- 支出300->存入200->存入100
假设执行了第一种顺序,因为数据不同步那么就可能存在支出300元的时候,另一个进程不知道,而只知道已经存入银行了200,然后又存入100,那么执行完毕后银行里剩下400元。账户就无缘无故多了300元的数据(其他顺序产生的可能请自己列举)。这就需要一个能够保证程序能够正确执行的机制。这个例子也许会让人感觉不太可能发生,因为实际在用的银行系统在设计时已经考虑了数据同步问题。那么再举一个比较容易发生和理解的例子。在大型QQ群里报数。有兴趣的可以找个QQ群尝试一下,看