离线并发的来源
在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表中本条记录的时间字段。(防止死锁的必要手段)
如果存在,也不超时,说明本条记录正在被其他用户修改,则返回并发信息。
http://www.yybean.com/j2ee-transaction-concurrency-control-strategy-summary
相关推荐
oracle并发和锁机制,oracle并发锁,oracle锁
04-大厂生产级Redis高并发分布式锁实战_ev.rar04-大厂生产级Redis高并发分布式锁实战_ev.rar04-大厂生产级Redis高并发分布式锁实战_ev.rar04-大厂生产级Redis高并发分布式锁实战_ev.rar04-大厂生产级Redis高并发...
该文档详细介绍了MySQL的锁机制,个人认为比较容易理解,总体都是个人记录,包括截图。
Redis高并发分布式锁实战_6
DML锁的目的在于保证并发情况下的数据完整性,它也是我们最常见和常用的锁,本文我们主要讨论DML锁。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为...
主要介绍了SQLite教程(十二):锁和并发控制详解,本文讲解了锁和并发控制机制概述、文件锁、回滚日志、数据写入、SQL级别的事务控制等内容,需要的朋友可以参考下
laravel分布式并发锁
Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用。但在C#中未提供类似功能。 作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 using System; using System.Collections.Generic; ...
SQL server锁的机制 SQL server锁的机制 SQL server锁的机制
01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始深入理解并发、线程与等待通知机制(上01、从0开始...
02、从0开始深入理解并发、线程与等待通知机制(中)02、从0开始深入理解并发、线程与等待通知机制(中)02、从0开始深入理解并发、线程与等待通知机制(中)02、从0开始深入理解并发、线程与等待通知机制(中)02、...
03、从0开始深入理解并发、线程与等待通知机制(下03、从0开始深入理解并发、线程与等待通知机制(下03、从0开始深入理解并发、线程与等待通知机制(下03、从0开始深入理解并发、线程与等待通知机制(下03、从0开始...
【BAT必备】并发编程锁面试题【BAT必备】并发编程锁面试题【BAT必备】并发编程锁面试题【BAT必备】并发编程锁面试题【BAT必备】并发编程锁面试题【BAT必备】并发编程锁面试题【BAT必备】并发编程锁面试题【BAT必备】...
锁机制基础
并发控制—悲观锁和乐观锁
net并发数据结构读写锁
本项目会以秒杀为案例,去思考怎么处理并发,对于并发控制是怎么使用Lock和Redis分布式锁来实现的。渐进式处理,让大家知道为什么这么改造代码。
2.论述分布式并发控制锁技术面临的主要问题。 论述使用锁实现分布式并发控制的技术要点。包括:锁的种类;锁相容性矩阵;全局锁调度器的作用与结构特点;加锁准则与算法;死锁及其预防技术;等。 3.选择一个实用的...
PHP阻塞锁和非阻塞锁机制,内置解决并发锁重复执行的方案。目前支持文件、Redis、Memcache、Memcached。