MySQL悲观锁是依靠数据库的锁机制来实现,以实现最大程度上的独占性。但由于现代的web系统一般都是高并发的,所以悲观锁在这样的情况下的适用性不高,所以我们有了和悲观锁相对应的乐观锁。

  乐观锁,是说假设认为数据一般情况下不会造成冲突,在数据进行提交更新的时候,会对数据的冲突与否进行检测,如果发生冲突了,则返回错误的信息,让用户决定如何去做。

  乐观锁的实现一般是在程序中来控制的。常规的实现一般有两种:使用数据版本(version),使用时间戳来实现。

实现详情:

1. 在表里添加一个字段version或者时间戳字段;

2. 在查询的时候,将该字段返回,更新的时候,先校验version字段或时间戳字段是否和表里的字段一致,如果一致就更新,并且把version字段加1(时间戳的话更新为当前时间),如果不一致就说明该字段已经被更新过,提示更新失败,然后把错误信息返回给用户;

通过一些伪代码来实现:

-- 伪代码:
-- 1. 并发查询,都查询id=1的记录
mysql> SELECT * FROM test_order WHERE id = 1;
+----+--------+------+----------+---------+-------------+
| id | status | name | goods_id | version | update_date |
+----+--------+------+----------+---------+-------------+
| 1 | 1 | 茅台 | 123 | 1 | NULL |
+----+--------+------+----------+---------+-------------+
1 row in set -- 2. 用户1执行更新操作
UPDATE test_order
SET status=1, version=version+1
WHERE id=1 and version=1 -- 3. 此时version是2,用户2再次执行更新操作,但此时就更新不成功了
UPDATE test_order
SET status=1, version=version+1
WHERE id=1 and version=1

乐观锁适用用冲突不多的场景,只有在最后更新的时候才去看是否冲突。所以如果冲突很多的话,数据争用激烈,会导致不断尝试,反而会降低性能。

所以,一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。(http://bbs.csdn.net/topics/340001655)

常用的SVN便是通过这种乐观锁类似的方式来实现的。

参考公众号:码农翻身

MySQL乐观锁的更多相关文章

  1. mysql乐观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...

  2. 使用mysql乐观锁解决并发问题

    案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交.最后实际账户余额为1000 ...

  3. 【转】MySQL乐观锁在分布式场景下的实践

    背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...

  4. MySQL乐观锁在分布式场景下的实践

    背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...

  5. 使用mysql乐观锁解决并发问题思路

    本文摘自网络,仅供个人学习之用 案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后 ...

  6. MySQL 乐观锁与悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁. 悲观锁: ...

  7. mysql乐观锁总结和实践(转)

    原文:mysql乐观锁总结和实践 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些不足,因为悲观锁大多数情况下依靠数据库的 ...

  8. mysql乐观锁总结和实践

    乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突 ...

  9. MySQL乐观锁为什么可以防止并发

    问题引入 本文介绍的是最常用的也是mysql默认的innoDB引擎 Read committed隔离级别下事物的并发.这种情况下的事物特点是 读:在一个事物里面的select语句 不会受到其他事物(不 ...

  10. Mysql乐观锁与悲观锁

    乐观锁和悲观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常重要的基础理念. Mysql的悲观锁 什么是悲观锁(Pessimistic Lock): 悲观锁的特点是先获取锁,再进行业务操作,即 ...

随机推荐

  1. [洛谷P4550]收集邮票

    题目大意:有$n(n\leqslant10^4)$个物品,第$i$次会从这$n$个物品中随机获得一个,并付出$i$的代价,问获得所有的$n$个物品的代价的期望. 题解:令$f_i$表示现在已经获得了$ ...

  2. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解

    肝了两题... T1一眼题,分解质因数,找出2的个数和5的个数取min输出 #include<iostream> #include<cstring> #include<c ...

  3. python基础之魔法方法

    由于hexo自带的markdown渲染引擎对双下划线做了转义,在正文中看到的魔法方法前后都没有双下划线 setattr.getattr.delattr 可以拦截对对象属性的访问 setattr函数是用 ...

  4. PhoneGap API介绍:Camera

    本文将介绍PhoneGap API——Camera:使用设备的摄像头采集照片,对象提供对设备默认摄像头应用程序的访问. 方法: camera.getPicture 参数: cameraSuccess ...

  5. tomcat log4j配置

    tomcat默认的log使用的是java.util.logging,配置文件在${catalina_base}/conf/logging.properties tomcat日志分类, 1.access ...

  6. TCP ------ TCP三次握手(建立连接)及其相关内容

    1.TCP客户端要连接到TCP服务器,需要经过三个过程: 以下是通过 Wireshark 抓取的三次握手数据包 → [SYN] Seq= Win= Len= MSS= → [SYN, ACK] Seq ...

  7. FreeRTOS - 定时器使用注意

    1.只有进入定时器守护任务,从定时器命令队列取出命令,队列空间才会空出一个可用空间:所有定时器公用一个定时器队列 2.如果使用软件定时器,在调度器开始前,会自动创建一个定时器守护任务,configTI ...

  8. C++ 指针常见用法小结

    1. 概论 2.指针基础 3. 指针进阶 4. 一维数组的定义与初始化 5. 指针和数组 6. 指针运算 7. 多维数组和指针 8. 指针形参 9. 数组形参 10. 返回指针和数组 11. 结语   ...

  9. LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子

    http://www.lightoj.com/volume_showproblem.php?problem=1340 题意:问n!在b进制下至少有t个后缀零,求最大的b. 思路:很容易想到一个数通过分 ...

  10. bzoj 2079: [Poi2010]Guilds——结论题

    Description Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工 ...