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是脏数据了,这是不允许的。这该如何解决?

解决方案

如果对数据库的访问服务是有多台机器的(不同的服务,或者服务部署了集群模式),可以采用如下几种方式之一:1. 使用程序的方式申请一个全局锁,比如使用Zookeeper就可以实现一个全局锁的功能,获得该锁的授权以后才能继续执行,这样保证对count的计算和insert都是串行执行的,不会存在脏数据;2. 使用某一个表的一条记录作为行锁(insert本身是无法加行锁的,因为insert之前数据还不存在),比如创建一个名为GLOBAL_LOCK的表,其中只有一条记录(假定有id这样一个字段,记录为id=1),操作之前做: select id from GLOBAL_LOCK where id=1 for update;这样也可以保证几个数据库事务本身是串行执行的;3. 操作之前锁整个表,这个和具体数据库有关以上两种方式都是基于全局锁的方式,效率比较低,在并发比较高的情况下慎用。题主的业务逻辑不清楚,如果是需要提高一些效率的话可能需要做一些缓冲的处理,不过要因具体的业务而定。
解决方案二:
看你用什么数据库了Oracle有Select for updateSqlServer有Ulock基本都是在事务中给数据加锁,在事务结束时候解锁。思路就是在一个事务开始的时候,把可能更新的数据锁上,另一个事务想读这个数据就要等待第一个事务解锁才行。这是悲观锁,后面的事务要等待。乐观锁就是给数据加个版本号的字段,等更新的时候检查版本号是不是自己当初查出来的版本号,如果不是就报错,或者重来。这种情况不等待,但是需要报错或者重来。

时间: 2024-09-20 12:34:43

java 数据一致性的相关文章

IBM WebSphere Application Server V7.0 Feature Pack for Java Persistence

IBM WebSphere Application Server V7.0 Feature Pack for Java Persistence API 2.0 新特性介绍 对象 - 关系持久化是 Java EE 应用开发中的一个重要部分.Java Persistence API (JPA) 是对象 - 关系持久化的 Java EE 标准,从 Java EE 5 开始被引入.最新的 JPA 2.0(JSR-317) 规范是 Java EE 6 标准的一部分,它引入了新的对象 - 关系持久化 API

浅谈Java线程的生命周期

创建线程 在 Java 程序中创建线程有几种方法.每个 Java 程序至少包含一个线程:主线程.其它线程都是通过 Thread 构造器或实例化继承类 Thread 的类来创建的. Java 线程可以通过直接实例化 Thread 对象或实例化继承 Thread 的对象来创建其它线程.在线程基础中的示例(其中,我们在十秒钟之内计算尽量多的素数)中,我们通过实例化 CalculatePrimes 类型的对象(它继承了 Thread),创建了一个线程. 当我们讨论 Java 程序中的线程时,也许会提到两

Java理论与实践: 理解JTS —— 事务简介

Java Transaction Service 是 J2EE 架构的关键元素.它与 Java Transaction API 结合在一起,使我们能够构建对于各种系统和网络故障都非常 健壮的分布式应用程序.事务是可靠应用程序的基本构建块 -- 如果没有事务 的支持,编写可靠的分布式应用程序将是非常困难的.幸运的是,JTS 执行的大 部分工作对于程序员都是透明的:J2EE 容器使事务划分和资源征用对程序员来 说几乎是不可见的.这个由三个部分组成的系列文章的第一期讲述了一些基础知 识,包括什么是事务

关于分布式系统的数据一致性问题

现在先抛出问题,假设有一个主数据中心在北京M,然后有成都A,上海B两个地方数据中心,现在的问题是,假设成都上海各自的数据中心有记录变更,需要先同步到主数据中心,主数据中心更新完成之后,在把最新的数据分发到上海,成都的地方数据中心A,地方数据中心更新数据,保持和主数据中心一致性(数据库结构完全一致).数据更新的消息是通过一台中心的MQ进行转发. 先把问题简单化处理,假设A增加一条记录Message_A,发送到M,B增加一条记录 MESSAGE_B发送到M,都是通过MQ服务器进行转发,那么M系统接收

Java虚拟机结构分析

本博文主要介绍了JVM(Java Virtual Machine)的组成部分以及它们内部的工作机制和原理.需要注意的是,虽然平时我们用的大多是Sun(现已被Oracle收购)JDK提供的JVM,但是JVM本身是一个规范,所以可以有多种实现,除了Hotspot外,还有诸如Oracle的JRockit.IBM的J9也都是非常有名的JVM. 1. 结构 下图展示了JVM的主要结构: 可以看出,JVM主要由类加载器子系统.运行时数据区(内存空间).执行引擎以及与本地方法接口等组成.其中运行时数据区又由方

Java Cache系列之Cache概述和Simple Cache

前记:最近公司在做的项目完全基于Cache(Gemfire)构建了一个类数据库的系统,自己做的一个小项目里用过Guava的Cache,以前做过的项目中使用过EHCache,既然和Cache那么有缘,那就趁这个机会好好研究一下Java中的Cache库.在Java社区中已经提供了很多Cache库实现,具体可以参考http://www.open-open.com/13.htm,这里只关注自己用到的几个Cache库而且这几个库都比较具有代表性:Guava中提供的Cache是基于单JVM的简单实现:EHC

java数据库交换怎么实现?

问题描述 java数据库交换怎么实现? 两台数据库服务器不同网段怎么保证其数据一致性?一个主服务器,两台分服务器.每天都要从主服务器上更新数据到分服务器.要求可以进行实时更新,也可以手动更新,已更新过的数据就不在重复更新,这样的程序要怎么实现? 解决方案 不会,静待大牛解答!

java多线程执行出现异常怎么办?

问题描述 java多线程执行出现异常怎么办? 使用spring+ibatis框架开发: 现在网站的下单流程分为三步,1.发送邮件和短信:2.删除购物车表:3.插入订单表: 现在用线程池来实现多线程的并发操作.但是如果其中一个线程出现异常,想的是应该全 部都回滚.那么如果来保证这三个线程之间的原子性. 解决方案 首先,必须使用互斥锁将你的操作在锁保护范围内:其次了,就是使用try-catch-finally进行异常捕获,一旦捕获异常就执行回滚操作 .最后,只要保证同一时刻只有一个线程执行相应的操作

Java并发框架——AQS中断的支持

线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠地停下来并不是一件容易的事,java也没有提供任何可靠的方法终止线程的执行.回到第六小节,线程调度策略中有抢占式和协作式两个概念,与之类似的是中断机制也有协作式和抢占式. 历史上Java曾经使用stop()方法终止线程的运行,他们属于抢占式中断.但它引来了很多问题,早已被JDK弃用.调用stop()