可能遇到这样的场景:数据库某一条记录的数据是3, 两个线程同时更新这条数据:查询出数据的值3,将它减1,得到2,再写回数据库。两个线程更新完后最后数据库数据可能是2。解决这个问题就要用到数据库自带的锁机制for update或者乐观锁。

1、for update

mysql 锁定记录行的方式for update是一个悲观锁而且是排它锁。for update锁定的行,在当前事务没有提交之前,其他事务即不能更新锁定的行,会被阻塞等待当前事务释放锁。
举例:

第一步:打开一个事务,关闭自动提交后,使用for update锁定一条记录

select * from student where id = 1 for update;

第二步:再打开一个窗口,再次执行相同的记录,发现会被阻塞等待锁。也就是说这个for update是个排他锁。

select * from student where id = 1 for update;

第三步:再打开一个新窗口,更新第一步被for update查询的记录,也被阻塞。

update student set age=12 where id =1;

总结:select * from xxx for update悲观锁某条记录一旦被锁定,其他事务尝试用select * from xxx for update再次获取记录上的锁会被阻塞,直到锁被持有的事务释放或者超时退出。其他事务尝试更新这条记录也会被阻塞等待锁释放直到超时退出为止。

第四步:让持有id=1记录锁的事务更新这条记录的age=12,但是不提交事务。

 update student set age=12 where id =1;select * from student where id = 1;

第五步:不持有锁的事务查询第四步持有锁更新记录,但是没有提交的记录。

简单查询,不使用for update

select * from student where id = 1;


总结2:for update锁定的记录,对于没有持有锁的事务来说,如果不使用for update竞争锁的话可以正常查询。根据mysql默认事务隔离级别:可重复读,读取的是未提交的数据。

mysql悲观锁for update相关推荐

  1. mysql悲观锁关键字_MySQL悲观锁 select for update实现秒杀案例(jfinal框架)

    MySQL悲观锁 select for update实现秒杀案例(jfinal框架) 发布时间:2018-08-17作者:laosun阅读(4287) 为了方便测试,博主使用最新的jfinal框架,里 ...

  2. MYSQL的悲观锁for update

    MYSQL的悲观锁for update 1 MYSQL的悲观锁 1.1 明确指定[主键/索引],查有数据,ROW_LOCK 1.2 明确指定[普通字段],查有数据,TABLE_LOCK 1.3 明确指 ...

  3. 【三大锁】悲观锁——mysql悲观锁

    一 三大常用锁 悲观锁 你准备去银行取10w了,跟银行提前打个招呼,有个10w现金谁都别动.(一般只限制写-别人不能取那10w但是能查到银行总体余额,某些场景会限制读) 乐观锁 你准备取10w了,不打 ...

  4. mysql 悲观锁实现

    一.mysql 悲观锁实现条件 ①.查询和修改必须在一个事务中 /*** 更新Inter数据*/ @Override @Transactional public void updateInterDat ...

  5. mysql悲观锁的应用_mysql悲观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个很是基础的概念.mysql 悲观锁(Pessimistic Lock) 悲观锁的特色是先获取锁,再进行业务操做,即"悲观&qu ...

  6. mysql悲观锁会有脏数据吗_mysql悲观锁原理详解

    mysql中的锁概念 mysql已经成为大家日常数据存储的最常用平台,但随着业务量和访问量的上涨,会出现并发访问等场景,如果处理不好并发问题的话会带来严重困扰.下面介绍一下如何通过mysql的悲观锁来 ...

  7. mysql悲观锁优化_MySQL数据库优化(三)—MySQL悲观锁和乐观锁(并发控制)

    一.悲观锁 1.排它锁,当事务在操作数据时把这部分数据进行锁定,直到操作完毕后再解锁,其他事务操作才可操作该部分数据.这将防止其他进程读取或修改表中的数据. 2.实现:大多数情况下依靠数据库的锁机制实 ...

  8. mysql 悲观锁和乐观锁区别

    1.mysql悲观锁:在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,依靠数据库提供的锁机制,每次会申请锁并加锁和解锁操作 第一步:两个终端均关闭自动提交 左边: 右边: 第二步:左边利用 s ...

  9. 使用mysql悲观锁解决并发问题

    使用mysql悲观锁解决并发问题 参考文章: (1)使用mysql悲观锁解决并发问题 (2)https://www.cnblogs.com/laoyeye/p/8228467.html 备忘一下.

最新文章

  1. 生成Excle模板,SXSSFWorkbook-2007之后版本不上传服务器
  2. python itchat 的使用
  3. 关于Newtonsoft.Json,LINQ to JSON的一个小demo
  4. safari检查元素_如何防止Safari检查是否使用Apple Pay
  5. babel 编译vue_如何对代码进行未来验证:使用Babel polyfills编译JavaScript VS
  6. 电商移动促销页面设计素材PSD分层模板,轻松出稿稿
  7. 轮播图高度自适应_【2020顶会NIPS】用于交通预测的自适应图卷积循环网络
  8. 超长干货 | Kubernetes命名空间详解
  9. Qt_解决Qt5.15 + Xcode12iOS端qmake不可用的问题
  10. 傻妞机器人老版安装教程
  11. 如何通过短视频平台实现高效裂变?小魔推同城流量推广了解一下
  12. 客厅2种“吉利树”,立秋之后快扦插
  13. 卡特兰数 默慈金数 默慈金三角形 反射原理
  14. MarkDown图片居中
  15. 智力杂志智力杂志社智力编辑部2023年第6期目录
  16. python实现四种出行路线规划(公交、步行、驾车、骑行)
  17. 像素格式结构-PIXELFORMATDESCRIPTOR
  18. python简单爬虫 多线程爬取京东淘宝信息教程
  19. 真是太开心了居然看见google yahoo收录的身影-原创天地
  20. Android Studio-Didn't find class XXX on path: DexPathList [zip file /data/xxx/base.apk]解决方法

热门文章

  1. 赞美CSDN 我去年买了个登山包超耐磨。
  2. 如何生成token,是使用token
  3. bios怎么设置USB启动
  4. java日志使用笔记
  5. 人为什么活着?这个观点绝对让你耳目一新
  6. 【寒武纪】视觉算法MLU220硬件适配(1)
  7. 知识图谱(Knowledge Graph)之综述理解
  8. 新版一年级上册数学期末试卷
  9. 【面经攒人品】蚂蚁金服—反洗钱岗
  10. testlink linux,Linux下安装testlink