kd__8301 2014-09-18 17:16
浏览 403
已采纳

java 数据一致性

有c/s b/s的2个项目,操作同一表结构A,表A中有字段count=100
其中

c/s的操作if(count>0){

     count=count-100

      insertData();
}

 

b/s的操作if(count>0){

     count=count-100

     insertData();
}

假设一种可能,c/s和b/s的同时通过验证if(count>0),这样会出现一种情况,count是脏数据了,这是不允许的。

这该如何解决?

  • 写回答

2条回答 默认 最新

  • mingxuxu 2014-09-19 08:29
    关注

    如果对数据库的访问服务是有多台机器的(不同的服务,或者服务部署了集群模式),可以采用如下几种方式之一:

    1. 使用程序的方式申请一个全局锁,比如使用Zookeeper就可以实现一个全局锁的功能,获得该锁的授权以后才能继续执行,这样保证对count的计算和insert都是串行执行的,不会存在脏数据;

    2. 使用某一个表的一条记录作为行锁(insert本身是无法加行锁的,因为insert之前数据还不存在),比如创建一个名为GLOBAL_LOCK的表,其中只有一条记录(假定有id这样一个字段,记录为id=1),操作之前做:
      select id from GLOBAL_LOCK where id=1 for update;
      这样也可以保证几个数据库事务本身是串行执行的;

    3. 操作之前锁整个表,这个和具体数据库有关

    以上两种方式都是基于全局锁的方式,效率比较低,在并发比较高的情况下慎用。

    题主的业务逻辑不清楚,如果是需要提高一些效率的话可能需要做一些缓冲的处理,不过要因具体的业务而定。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办