离线并发的来源
在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 1.8 API离线手册是一份...通过阅读和使用Java 1.8 API离线手册,开发者可以深入理解这些概念,并将它们应用到实际项目中,提高开发效率和代码质量。对于初学者和经验丰富的开发者来说,都是一个非常有价值的资源。
通过以上技术点的实现,我们可以构建一个功能完善的Java离线浏览器,不仅能满足用户在无网络环境下的阅读需求,还能提供稳定的性能和跨平台的兼容性。在设计和开发过程中,应充分考虑用户体验,优化资源管理和下载...
在9.3版本中,它为Java开发者提供了一套丰富的工具,以便在Java环境中高效地访问、操作和管理地理信息系统(GIS)数据。 该离线帮助手册包含了以下几个关键知识点: 1. **ArcSDE架构**:ArcSDE是基于服务端的数据...
Java离线API中文版是Java开发者的重要参考资料,它包含了Java开发语言的核心类库、接口和方法的详细描述,便于开发者在没有网络连接的情况下快速查阅和理解API的功能与用法。这个压缩包文件"JAVA_API_1.8_CHS.CHM"是...
3. **多线程**: Java 6对多线程的支持非常完善,`java.lang.Thread`类和`java.util.concurrent`包提供了创建和管理线程的机制,以及高级并发工具,如`ExecutorService`和`Future`。 4. **网络编程**: `java.net`包...
Java文档中文版API离线CHM版是针对Java开发者的一款重要参考资料,主要用于帮助开发者理解和使用Java SDK(标准开发工具包)中的各种类库、接口和方法。这个版本是1.6,虽然较新版本的Java已经发布,但1.6仍然是广泛...
它避免了C++和Java等语言中的许多复杂特性,如模板和继承。 2. **垃圾回收**:Go语言内置了垃圾回收机制,自动管理内存,减少了程序员处理内存泄漏和内存管理的工作负担。 3. **并发编程**:Go语言通过goroutines...
Java SE 中英文离线文档是学习和开发Java程序的重要参考资料,它包含了详细的API说明、示例代码以及各种类和接口的解释。 API(Application Programming Interface)是Java SE的核心组成部分,它定义了Java编程语言...
Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...
tinympi4j是一款专为Java开发者设计的微型分布式离线计算框架,它的核心目标是提供一个简单、直观的工具,让开发人员能够轻松地进行大规模数据处理和计算任务。这款框架的设计理念是降低学习曲线,使得即使是对...
本文将深入探讨如何在分布式事务中实现基于Oracle PL/SQL的UL (User-Level) LOCK的悲观离线锁策略。这种策略主要用于防止多个并发操作对同一数据进行修改,从而避免数据不一致性和死锁等问题。 首先,理解悲观锁的...
2. **改进的锁机制**:引入了`java.util.concurrent.locks`包,提供了可中断的锁、读写锁等高级同步机制。 四、XML支持 Java 5增强了对XML的支持,包括SAX和DOM解析器的性能提升,以及JAXB(Java Architecture for ...
阿里JAVA开发规范ECLIPSE离线插件是一款专为Java开发者设计的工具,尤其适合在无法连接到外部网络的环境中使用。这款插件是阿里巴巴集团根据其内部的Java编程规范打造的,旨在提高代码质量和团队协作效率。通过集成...
Java API中文参考手册是Java开发者不可或缺的工具之一,它提供了详尽的Java类库文档,帮助程序员理解并使用Java平台的各种API。...因此,对于Java开发者来说,拥有这样一份离线文档是非常有价值的。
- **java.util.concurrent.locks**:锁机制支持。 - **java.util.jar**:支持JAR文件的创建和处理。 - **java.util.logging**:日志记录支持。 - **java.util.prefs**:用户偏好设置支持。 - **java.util.regex...
在分布式环境中,为了确保并发操作的安全性,锁机制是必不可少的。Redis作为一个内存数据库,提供了高效的数据操作,常被用作分布式锁的实现基础。可重入分布式锁允许一个线程多次获取同一锁,防止死锁,并且能确保...
此外,线程(Thread)和并发(Concurrency)机制是Java多任务处理的关键。Java API文档还涵盖了反射(Reflection)和注解(Annotation)等高级特性,帮助开发者深入理解Java的内在机制。 最后是Python2的API文档。...
5. **国际化和本地化**:Java 1.6对国际化和本地化支持进行了优化,提供了一套完整的资源包管理机制,方便开发多语言的应用程序。 6. **JDBC 4.0**:数据库连接接口JDBC在1.6版本中升级到4.0,增加了自动注册驱动、...
6. **垃圾回收与内存管理**: Java的自动内存管理机制,包括垃圾回收的工作原理和内存泄漏的预防。 7. **JVM**: Java虚拟机的工作原理,类加载机制,内存模型,以及如何通过JVM调优提升应用性能。 8. **编译与部署**:...
同时,理解类与对象的概念,以及封装、继承和多态这三大面向对象特性,是深入Java编程的关键。 【网络编程】 "QQ案例"涉及到网络编程,这是Java中的一个重要领域。Java的Socket编程允许创建客户端(Client)和...