`

java并发之(六)离线锁

 
阅读更多

来自:http://www.blogjava.net/super2/archive/2008/11/01/237994.html

 

离线并发的来源

         Web项目中,离线并发显得尤其严重。例如,用户A和用户B同时修改数据库中的某张表的R行,加入R行有两个字段分别是C1C2

         假如按照如下过程修改:

         1 用户A将数据RC1,C2)读取到A的浏览器中。

         2 用户B将数据RC1,C2)读取到B的浏览器中。

         3 用户A在浏览器上将数据修改为RC1’C2),同时更新到数据库。

         4 用户B在浏览器上将数据修改为RC1C2’),同时更新到数据库。

        

         上述过程存在两个问题,第一,第4B在修改数据的时候数据库中的数据和B的浏览器中数据已经不一致了;第二,如果程序按照哪个字段变化在数据库中更新哪个字段的方式处理的话,那么经过上述四步修改,数据库中R行的内容是(C1’,C2’),这和A或者B的想法都不同(A认为是(C1’C2),B认为是(C1C2’))。

 

         上述过程中A对数据库的修改过程或者B对数据库的修改过程,都是无法根据数据库的最新内容做修改,所以成为离线。AB同时对记录R进行就该叫离线。

 

         以上的环境叫离线并发。

 

         那么如何解决离线并发过程中遇到的问题呢?我们引入锁机制。

        

锁机制

         锁机制,就是在需要修改的数据上加互斥锁,通过互斥锁避免数据被同时修改。锁机制更具其应用环境又分为乐观锁悲观锁

 

         乐观锁

乐观锁,指认为冲突很少发生,所以只是在数据修改的时候比较修改的基础数据和数据库中的数据是否相同,相同则修改,否则提示用户重新装入数据库中已经变化的数据。

实现方法1:在进行update的时候使用where条件,在Where标间中比较所有上一步中查询得到的数据。如果数据库中的数据没有变化,则update可以更新到内容,否则update语句不能更新到内容,可以根据update的返回值确定更新是否成功。

实现方法2:在每一个表中追加一个特殊字段,类型为timestamp,每次更新的时候比较这个字段的值是否一致,如果一致,则更新,同时将这个字段更新为当前时间,否则,说明数据已经变更。这也可以使用update加上where实现。

 

         悲观锁

悲观锁指,需要修改的数据,在读取的时候就对数据加锁,其他用户在准备修改,读取数据的阶段判断数据是否上锁,以此来决定是否进行修改前的读操作。

        

                  实现方法:

                   通常在数据库中建立一张lock表,该表的字段包括,表明,唯一索引,时间,用户信息等。

        

在用户读取数据准备修改的时候,首先判断lock表中是否存在自己将要读取的数据。

如果不存在,则在lock表中添加一条记录,记录对那张表的哪行数据进行修改;如果存在,在判断时间字段是否超时。

如果超时,则更新lock表中本条记录的时间字段。(防止死锁的必要手段)

如果存在,也不超时,说明本条记录正在被其他用户修改,则返回并发信息。

分享到:
评论

相关推荐

    Java并发编程相关资料

    非常权威的关于Java并发编程的博客和网页,浏览器离线缓存文件,可以直接用浏览器打开。

    jmeter 测试工具 使用java自测 并发测试 环境测试 压力测试

    4.完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。 5.精心的GUI设计允许快速操作和更精确的计时。 6.缓存和离线分析/回放测试结果。 JMeter的高可扩展性 1.可链接的取样器允许...

    无涯教程(LearnFk)-Java-Nio教程离线版.pdf

    无涯教程网(learnfk)整理提供:NIO是一种同步非阻塞的I/O模型,是解决高并发、I/O处理问题的有效方式。

    tinympi4j是一款微型的java分布式离线计算框架

    tinympi4j 是一款微型的 java 分布式离线计算框架, 实现原理如图: 特性 简单直观, 没有任何学习难度 slave支持多个任务并发/并行执行 使用HTTP协议通信 场景:

    Java项目源码之聊天系统的实现(java+applet).zip

    在线状态:显示用户的在线状态,包括在线、离线等,提供及时的沟通状态提示。 技术选型: Java Applet:使用Applet技术实现客户端的用户界面,通过浏览器插件方式嵌入网页中,提供交互式的用户体验。 Servlet:使用...

    Java博客系统Zblog2.zip

    Zblog是一个java实现的开源博客系统。 核心功能 文章/页面发布、分类、统计阅读次数。 提供文章形式的RSS聚合。 提供链接的添加、归类功能。 附件上传添加管理功能。 评论的管理,垃圾信息过滤功能。...

    Java常见面试问题.docx

    1.ribbon 负载均衡 项目客户端的负载均衡采用ribbon,...离线乐观锁 5.Jms两种消息机制? 点对点、发布订阅 6.Rbac? 用户角色权限设计 7.Shiro用到了那些功能及原理? Shiro缓存用户权限了解一下 8.Svn和git的区别? ...

    分布式存储系统笔记

    *事务与并发控制(如何实现并发控制?如何实现多版本并发控制) *易用性(如何对外设计接口是的系统容易使用?如何设计监控系统并将系统的内容状态方便的形式暴露给运维人员) *压缩和解压缩

    基于 Java Web 项目的 SpringBoot 框架初始化模板,可基于此快速开发毕设等中小型项目

    基于 Java Web 项目的 SpringBoot 框架初始化模板,该模板整合了常用的框架,保证大家在此基础上能够快速开发自己的项目,该模板针对于后端启动开发小而精,本项目会由作者持续更新。 业务特性: 1、使用 Undertow ...

    基于JAVA的网络通讯系统设计与实现.rar

    多线程支持:服务器端和客户端都需要支持多线程,以处理多个客户端的并发连接和消息传输。 功能设计: 用户注册与登录:用户可以注册新账号并登录系统,系统应提供身份验证机制来确保用户身份安全。 消息传输:支持...

    基于java的聊天系统的设计于实现.rar

    多线程支持:服务器端和客户端都需要支持多线程,以处理多个客户端的并发连接和消息传输。 功能设计: 用户注册与登录:用户可以注册新账号并登录系统,系统应提供身份验证机制来确保用户身份安全。 好友管理:用户...

    JMeter Manual

    Apache Jmeter 是一个100%...2. 完全多线程,允许通过多个线程并发取样和单独的线程组不同的功能同时取样。 3. 完全可移植性和100%纯JAVA。 4. 精心的GUI设计允许快速操作和更精确的计时。 5. 缓存和离线分析测试结果。

    Quartz.pdf

    quartz中文文档,易懂且齐全,该文档包括quartz的使用,Trigger说明,job并发,spring整合quartz以及持久化相关的知识,相对网上看到的文档来说,更容易上手和入门

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    多人聊天室二(服务器端)

    设计实现了一个基于C/S模型下的网络聊天工具,主要具有以下功能(服务端使用并发服务器) 1) 用户注册、登录 2) 支持多人聊天 3) 支持离线消息 实现扩展要求: 1) 该工具具有友好的用户界面和服务器界面 2) ...

    jmeter4.0免安装版

    2.完全的可移植性和100% 纯java。 3.完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包。 4.完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。 5.精心的GUI设计允许...

    基于javatcpsocket通信的拆包和装包源码-niochatroom:基于Javanio的聊天室

    基于java tcp socket通信的拆包和装包源码 功能 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2)实现多人群聊 3)服务器端:可以监测用户上线,离线,并实现消息转发功能 4)客户端:...

    java红酒网站源码-Project-Ideas:每个初学者的项目创意

    编程并发服务器 从零开始的 MQTT Broker OpenGL: 使用 OpenGL 在 C++ 中创建 2D Breakout 游戏克隆 碰撞 (视频) C#: 这是一个 Wiki 风格的内容管理系统,完全用 C# 编写,带有 ASP.NET Core 和 Razor Pages。 ...

    java简易版开心农场源码-JAG:Jenkins+Ansible+Gitlab持续交付学习记录

    java简易版开心农场源码 Jenkins+Ansible+Gitlab 之 三剑客学习笔记 1-GitLab介绍 什么是GitLab GitLab是一个开源分布式版本控制系统 开发语言:Ruby 功能:可以通过WEB界面管理项目源代码,版本控制,代码复用与...

    JMeter5.4.1性能测试工具

    完整的多线程框架允许多个线程并发采样和不同线程组同时采样不同功能。 缓存和离线分析/重放测试结果。 高度可扩展的核心: 可插拔采样器允许无限的测试功能。 可编写脚本的采样器(与 JSR223 兼容的语言,如Groovy...

Global site tag (gtag.js) - Google Analytics