博客2:https://www.cnblogs.com/laoyeye/p/8097684.html

1、使用版本号实现乐观锁

版本号的实现方式有两种,一个是数据版本机制,一个是时间戳机制。具体如下。

下单操作包括3步骤:

1.查询出商品信息

select (status,status,version) from t_goods where id=#{id}

2.根据商品信息生成订单

3.修改商品status为2

update t_goods

set status=2,version=version+1

where id=#{id} and version=#{version};

2、使用条件限制实现乐观锁

UPDATE t_goods

SET num = num - #{buyNum}

WHERE

id = #{id}

AND num - #{buyNum} >= 0

AND STATUS = 1

问题引入

当事务的隔离级别是REPEATABLE_READ情况下:当前事务不能select到并发事务中已经提交的事务。

当事务的隔离级别是READ COMMITTED情况下:当前事务能select到并发事务中已经提交的事务。

Mysql默认的事务隔离级别为repeatable_read :https://www.cnblogs.com/kangshuai/p/5735374.html

读:在一个事物里面的select语句 不会受到其他事务(不管其他事务有没有commit)的影响。

写:对一条记录而言,一个事务一旦update一条记录,其他事务只能等待这个事务commit才能update那条记录。

乐观锁处理并发的原理 重点

1)一个事物中的select语句可能不会收到其他事物的影响,也就是可能查不到其他并发中未提交的事物(即使提交了 如果是REPEATABLE_READ也查不到)。所以两个事物共同执行时产生了并发的冲突。

2)虽然这个被并发的字段通过select查不出来,但是在where条件语句中 这个字段会受到其他事物的影响 。所以可以利用这点 可以读到并发事物影响的数据 ,从而做出判断,防止并发。

所以可用下面方式处理(利用乐观锁处理事物的并发)

数据库增加一个锁的处理列(版本号),查询的时候多查一个版本号, update的时候 where条件附加一个版本号条件并且更新时候并且把版本号+1,处理流程

1)select num,version from table;

2)update table set num=num-1 ,version =version+1 where condition=? version=#{version}

3)Query OK, 1 rows affected (0.04 sec) | 注意:1 rows affected

update的时候 where条件附加一个版本号条件并且更新时候并且把版本号+1: update table set num=num-1 ,version =version+1 where condition=? version=#{version}

如果出现了查询时候的版本号和where条件的版本号不一致 说明其他事物并发影响到了版本号 version,此时update语句的影响行数(Query OK, 1 rows affected (0.04 sec))是0 然后做异常处理。()

mysql使用条件限制乐观锁_mysql乐观锁解决并发问题相关推荐

  1. mysql默认使用悲观锁_mysql乐观锁和悲观锁详解

    mysql乐观锁和悲观锁详解 相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了. 那么乐观锁和悲观锁到 ...

  2. mysql如何使用乐观锁_mysql 乐观锁和悲观锁

    数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的 ...

  3. mysql悲观锁和乐观区别_MySQL悲观锁和乐观锁的区别是什么

    MySQL悲观锁和乐观锁的区别是什么 区别如下: 1.概念不同 乐观锁( Optimistic Locking): 顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,&qu ...

  4. mysql如何使用乐观锁_mysql 乐观锁实现

    一.为什么需要锁(并发控制)? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: 1.丢失更新:一个事务的更新覆盖了其它事务的更新结果, ...

  5. innodb 悲观锁 乐观锁_mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁

    mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使 ...

  6. mysql实现悲观锁_mysql悲观锁怎么实现?

    mysql悲观锁的方法:1.首先利用[select ... for update]加锁,操作完成后使用commit来释放锁:然后innodb引擎来默认行级锁:最后查不到数据时,则不锁表即可. mysq ...

  7. mysql innodb默认的锁_Mysql InnoDB锁

    MySQL 不同引擎的锁机制: MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoD ...

  8. mysql mdl 锁_MySQL MDL锁

    MDL全称为metadata lock,即元数据锁.MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作.因此从MySQL5.5版本开始引入了M ...

  9. mysql全局读写怎么锁_MySQL全局锁和表锁

    最近正好在看操作系统中关于线程,锁的部分,也可以学习一下数据库种的锁. MySQL的锁分为全局锁,表级锁,行锁三类. 全局锁 名思义,全局锁就是对整个数据库实例加锁.MySQL提供了一个加全局读锁的方 ...

  10. mysql 全局锁_Mysql全局锁和表级锁

    以前对Mysql的锁的认识,只了解表锁和行锁,其实Mysql的锁的种类还是不少的,有全局锁,表级锁,行级锁,还有元数据锁,间隙锁,临界锁. 一 全局锁 Mysql的全局锁是对整个实例加锁,加锁之后,数 ...

最新文章

  1. python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
  2. Google Ajax Search 参考
  3. 跟益达学Solr5之Schema.xml详解
  4. 光伏电站或成辅助服务市场“输家”
  5. 数据结构基础:栈(Stack)
  6. python ppt自动生成_如何自动化生成PPT缩略图?
  7. 模拟网页行为之工具篇
  8. LeetCode 69. Sqrt(x)
  9. linux 命令学习 —— 硬件外设管理(dmesg、lsusb)
  10. C++map关联容器2.0
  11. comsol初学经验分享
  12. 【IDM+百度网盘助手】突破百度云下载限速,适用于谷歌浏览器【图文+附下载地址】
  13. 旺旺文件上传服务器在哪,手机旺旺服务器在哪里设置
  14. GIC检测中断的流程
  15. hive使用适用场景_大数据入门:Hive应用场景
  16. Golang type assertion 类型断言
  17. 程序员必读书籍一览表
  18. Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)
  19. 入股联华马云新零售战略翻篇:最终要让电子商务成历史
  20. 刚在在win8.1下装了ubuntu12.04

热门文章

  1. 网红电商剧烈洗牌,机会将属于拥有“头部网红矩阵”的MCN机构?
  2. gcc -shared -o libJava.so Java.o ./libdemo.a
  3. Jquery----下拉菜单(利用滑动效果)
  4. 用树莓派组装了一台电脑
  5. 【回归预测-FNN预测】基于蝙蝠算法优化前馈网络实现数据回归预测附Matlab代码
  6. 简单面试题,但是容易忘记
  7. IE浏览器低版本判断及升级提示
  8. config server高可用的怀疑(非副本集模式)
  9. 赴美工作常识(Part 6 - 绿卡排队)
  10. 英语语言水平C级,国际通用的学生英语能力水平评测标准