`
yuelangyc
  • 浏览: 449575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中离线并发与锁机制。

阅读更多
离线并发的来源

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

        假如按照如下过程修改:

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

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

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

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



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

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

        以上的环境叫离线并发。

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

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

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

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

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

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

实现方法:
        通常在数据库中建立一张lock表,该表的字段包括,表明,唯一索引,时间,用户信息等。
        在用户读取数据准备修改的时候,首先判断lock表中是否存在自己将要读取的数据。

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

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

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/struts2/archive/2007/08/14/1742686.aspx
分享到:
评论

相关推荐

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

    基于Java的网络通讯系统设计与实现如下: 系统架构: 客户端-服务器架构:采用客户端-服务器模式,其中服务器负责接收、处理和转发消息,而客户端负责发送和接收消息,并提供用户界面。 多线程支持:服务器端和...

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

    用户认证与授权:采用安全的用户认证机制,确保用户身份的安全和权限的控制。 数据加密:对用户敏感信息和消息内容进行加密处理,保护用户隐私和数据安全。 性能优化: 缓存技术:利用缓存技术提高系统的性能,减轻...

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

    基于Java的聊天系统设计与实现如下: 系统架构: 客户端-服务器架构:采用客户端-服务器模式,其中服务器负责接收、处理和转发消息,而客户端负责发送和接收消息,并提供用户界面。 多线程支持:服务器端和客户端...

    Java常见面试问题.docx

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

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

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

    大型分布式网站架构与实践

     5.1.1 inotify机制 339  5.1.2 ActiveMQ-CPP 343  5.1.3 架构和存储 359  5.1.4 Chukwa 362  5.2 离线数据分析 369  5.2.1 Hadoop项目简介 370  5.2.2 Hadoop环境搭建 374  5.2.3 MapReduce编写 384  ...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    低清版 大型门户网站是这样炼成的.pdf

    6.1 java程序员的春天厚礼—spring 2.5 349 6.1.1 爱上spring 2.5的十大理由 350 6.1.2 一睹spring 2.5芳容 351 6.1.3 spring 2.5拿手戏——控制反转与依赖注入 353 6.1.4 何为“面向切面编程aop” 356 6.1.5 ...

    asp.net知识库

    利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文...

    hibernate3.04中文文档.chm

    符合Java习惯的关系数据库持久化 目录 前言 1. 翻译说明 2. 版权声明 1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 ...

    RSA实验报告.docx

    RSA实验报告 一 实验目的 了解非对称加密机制 理解RSA算法的加解密原理 熟悉Java的学习以及运用Java实现RSA算法的加解密过程 二 实验背景 在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即...

    hibernate3.2中文文档(chm格式)

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

    VC与Labview、Matlab编程论文资料

    Java可视化集成开发环境的研究与实现.pdf Java调用VC_DLL实现串口GPS的访问.pdf LabVIEW_快速构建步进电机控制系统的利器.pdf LabVIEW下普通数据采集卡的驱动与调用.pdf LabVIEW下远程虚拟实验室的研究与实现....

    Hibernate中文详细学习文档

    符合Java习惯的关系数据库持久化 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. ...

    VC与Labview、Matlab编程论文资料[2].rar

    Java可视化集成开发环境的研究与实现.pdf Java调用VC_DLL实现串口GPS的访问.pdf LabVIEW_快速构建步进电机控制系统的利器.pdf LabVIEW下普通数据采集卡的驱动与调用.pdf LabVIEW下远程虚拟实验室的研究与实现....

    VC与Labview、Matlab编程论文资料[4].rar

    Java可视化集成开发环境的研究与实现.pdf Java调用VC_DLL实现串口GPS的访问.pdf LabVIEW_快速构建步进电机控制系统的利器.pdf LabVIEW下普通数据采集卡的驱动与调用.pdf LabVIEW下远程虚拟实验室的研究与实现....

    HibernateAPI中文版.chm

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

    Hibernate教程

    16.8. 离线(detached)查询和子查询 17. Native SQL查询 17.1. 创建一个基于SQL的Query 17.2. 别名和属性引用 17.3. 命名SQL查询 17.3.1. 使用return-property来明确地指定字段/别名 17.3.2. 使用存储过程来查询...

Global site tag (gtag.js) - Google Analytics