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

离线并发与锁机制

    博客分类:
  • J2EE
阅读更多




离线并发的来源

         在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表中本条记录的时间字段。(防止死锁的必要手段)

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

相关推荐

    在分布式事务中实现基于Oracle PLSQL UL LOCK的悲观离线锁

    在分布式系统中,事务处理是确保数据一致性与正确性的关键环节。当涉及到多个数据库操作时,分布式事务就显得尤为重要。...在实际应用中,结合使用数据库管理和开发工具,可以更有效地实施和维护这样的锁机制。

    基于redis的可重入分布式锁、离线条形码生成与校验方案、常见框架使用demo.zip

    在分布式环境中,为了确保并发操作的安全性,锁机制是必不可少的。Redis作为一个内存数据库,提供了高效的数据操作,常被用作分布式锁的实现基础。可重入分布式锁允许一个线程多次获取同一锁,防止死锁,并且能确保...

    FreeRTOS离线版参考手册

    4. **中断服务程序**:处理中断,可能需要与FreeRTOS内核的同步机制配合。 5. **硬件抽象层**:封装硬件接口,使FreeRTOS API能调用底层驱动,如定时器、串口等。 FreeRTOS的灵活性和可扩展性使得它广泛应用于各种...

    python多线程池离线安装包.zip

    在实际应用中,你可能还需要关注多线程的同步问题,如锁机制(Lock)、条件变量(Condition)以及事件对象(Event),以防止数据竞争和死锁,确保程序的正确性。同时,理解线程池的工作原理和调优策略,如合理设置...

    离线数据存储和上传方案

    6. **数据一致性**:确保服务器端和客户端数据的一致性,可能需要使用乐观锁或悲观锁等并发控制策略。 通过以上组件和策略的组合,离线数据存储和上传方案可以为各种应用提供可靠的数据管理,无论是在移动设备还是...

    数据库系统概论离线在线测试题目与答案

    - 锁机制:防止多个用户同时修改同一数据,如共享锁(读锁)、排他锁(写锁)。 - 多版本并发控制(MVCC):允许多个版本并存,避免阻塞其他读写操作。 - 死锁检测与解除:检测和解决两个或更多事务无法继续进行...

    java多线程和并发.pdf

    除此之外,Java的并发工具包java.util.concurrent提供了大量方便的类和接口,如ExecutorService用于线程池管理,BlockingQueue用于线程间协作,以及锁机制(如ReentrantLock和读写锁)等。 多线程的优势主要体现在...

    FreeRTOS离线参考手册

    - **信号量(Semaphore)**:用于保护共享资源,允许有限数量的并发访问。 - **互斥锁(Mutex)**:确保同一时间只有一个任务访问共享资源。 - **事件标志组(Event Flags)**:用于多个事件之间的通信,任务可以...

    java5在线版和离线版

    2. **改进的锁机制**:引入了`java.util.concurrent.locks`包,提供了可中断的锁、读写锁等高级同步机制。 四、XML支持 Java 5增强了对XML的支持,包括SAX和DOM解析器的性能提升,以及JAXB(Java Architecture for ...

    高性能离线缓存存储引擎.pptx

    #### 一、离线缓存架构与设计 **1.1 分布式架构与分区管理** - **分布式架构**:高性能离线缓存存储引擎通常采用分布式架构,将整个缓存划分为多个分区,每个分区由一组独立的服务器进行管理。这种设计能够有效...

    离线任务平台 v1.0-源码.zip

    5. **并发编程**:多线程、锁和并发控制在任务调度和执行过程中至关重要。 6. **持续集成/持续部署(CI/CD)**:学习如何设置Jenkins或GitLab CI等工具,自动化构建和测试流程。 7. **日志与监控**:如使用ELK Stack...

    jee事务控制.pdf

    乐观离线锁与悲观离线锁 对于跨事务的访问控制,可以采用乐观离线锁或悲观离线锁。这两种策略类似于单个事务内的乐观锁和悲观锁,但应用于不同事务之间的交互。 - **乐观离线锁**:通过版本字段或其他机制检测...

    高并发海量数据解决方案(J2EE)

    9. **容错与恢复**:引入熔断、降级和重试等机制,例如Hystrix,以增强系统的容错性。同时,数据备份和恢复策略也是保障服务连续性的必要手段。 10. **持续集成与自动化测试**:通过Jenkins等工具实现持续集成,...

    高并发高可用的可伸缩的架构设计的原则

    - **容灾备份**:包括离线与在线数据同步、全量与增量备份、热备与冷备等多种策略,确保数据的安全性和服务的连续性。 - **读写分离**:将读取操作和写入操作分开处理,减轻数据库的压力,提高系统的响应速度。 ###...

    cplusplus.com V3.1离线版

    线程同步机制如互斥锁、条件变量等也是必须了解的内容。 7. **输入/输出流**:C++的I/O库提供了流的概念,使得数据的输入输出操作变得简洁且易于理解,例如iostream库中的cin、cout等。 8. **C++标准库**:除了...

    大连理工大学《操作系统》大作业离线作业答案 (2).pdf

    这个作业的核心是生产者与消费者问题,这是并发编程中的一个经典模型。 生产者与消费者问题是多线程编程中的一种典型应用场景,涉及到了进程同步和互斥的概念。在该问题中,一组生产者进程负责生成数据并放入一个...

    DataSet中的数据并发性异常.doc

    如果一个CSR在另一个更新数据后提交更改,那么就会检测到数据并发性问题,因为数据库记录的状态与DataSet中的状态不符。 数据并发性异常的常见原因是: 1. **脏读**:一个事务读取了另一个事务未提交的修改。 2. *...

    构建高并发高可用的电商平台架构实践.pdf

    - **并发控制与事务**:乐观锁、悲观锁、Latch、mutex、写时复制(Copy-on-Write)和Compare-and-Swap (CAS)等机制用于并发控制,保证共享资源的安全访问。多版本并发控制(MVCC)在数据库中用于事务一致性。 6. *...

    osdev 离线wiki

    9. **多线程与并发**:多线程允许程序同时执行多个任务,而并发则涉及如何在有限的处理器资源下协调这些任务。了解线程同步和互斥机制(如锁、信号量、条件变量)是多线程编程的关键。 10. **网络编程**:操作系统...

Global site tag (gtag.js) - Google Analytics