一、问题
网络共享数据库数据可以理解为多个进程对同一数据库的操作,如果只有1方是具有写权限而其它方只是读权限时,这类系统很好处理。但当多方都具有写的权限时,有存在读-修改-写的同步问题,如下:
B方存在所读数据不同步的问题。这个问题将来会在应用中,如多个设备同享一个数据库,由于存在数据不同步,此将引起数据的不可靠,放大的说将导致很大的经济纠纷。
二、分析
虽当前项目遇到这种偶发事件机率极低,但作为一个长期稳定的系统来说,必须得解决,所以经过一段时间的研究,总结出以下两种方法:
第一种方法:当要修改数据时,先对数据库某条数据进行单独写保护,写完成退出保护,
优点:可对其中一条数据进行写保护,而不影响其它数据的读写。
缺点:不适合于长时间占用写保护。比如,用户进入界面显示数据,然后花了10分钟修改了数据,之后再保存。在这种系统方式下,别的用户体验会很糟糕。
另外有些数据库还不支持这种方式,需要对数据库进行封装建模管理。对外接口上就属于非标准化了,存在与第三方对接的工作。
第二种方法:1、数据库统一由一个线程操作。此线程接受来自不同线程或进程(网络)的操作事件,并按事件进行执行
2、对于修改的操作事件,必须在事件输入信息中提供原始数据。只有原始数据与当前数据库相同时,才可能正常候改。
优点1:可解多方修改数据导致不同步的问题,应用端的调用也是比较简单。
优点2:不再被所选用数据库的功能而限制了。
缺点1:需要对数据库进行封装建模管理。对外接口上就属于非标准化了,存在与第三方对接的工作。
缺点2:增加了数据库操作的事件方式。
缺点3:将加对数据库中当前数据的读的时间,但以可忽略的时间换系统的长期稳定来说,是值的。
在设计时,另外要注意多种不同组合数据存在同时读取与写入时,要注意分组打包,以免设计出太多的事件方式。
三、实测情况
通过模拟各种突发事件测试,结论为:第2种方法解决了网络共享和多线程对同一数据操作的冲突问题,执行效率也是比较高。