博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql 先SELECT 后UPDATE 问题
阅读量:5960 次
发布时间:2019-06-19

本文共 901 字,大约阅读时间需要 3 分钟。

hot3.png

最近做一个统计;需要把一个字段(存放数据是json)里某一个数字加1 然后在修改该字段;当时就那么一写最后发现该数据和明细对不上; 其实这个应该是并发引起的,先select 在update 这样写其实会出现一些问题

###第一种解决方案

事务,即用一个事务来包裹上面的SELECT+UPDATE操作+写共享锁。

读共享锁是通过下面这样的SQL获得的:SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;

如果事务A获得了先获得了读共享锁,那么事务B之后仍然可以读取加了读共享锁的行数据,但必须等事务A commit或者roll back之后才可以更新或者删除加了读共享锁的行数据。

如果事务A先获得了某行的写共享锁,那么事务B就必须等待事务A commit或者roll back之后才可以访问行数据。

SELECT counter_field FROM child_codes FOR UPDATE;UPDATE child_codes SET counter_field = counter_field + 1;

###第二种解决方案

乐观锁,上面是一种观锁机制,而且SELECT...FOR UPDATE方式也不太常用

SELECT counter_field FROM child_codes FOR UPDATE;UPDATE child_codes SET counter_field = counter_field + 1 WHERE counter_field='上面select出来的值' ;

这样可以根据UPDATE返回值来判断是否更新成功,如果返回值是0则表明存在并发更新,那么只需要重试一下就好了。

  1. 如果对读的响应度要求非常高,比如证券交易系统,那么适合用乐观锁,因为悲观锁会阻塞读

  2. 如果读远多于写,那么也适合用乐观锁,因为用悲观锁会导致大量读被少量的写阻塞

  3. 如果写操作频繁并且冲突比例很高,那么适合用悲观写独占锁

转载于:https://my.oschina.net/u/729139/blog/702514

你可能感兴趣的文章
《zw版·Halcon-delphi系列原创教程》halconxlib控件列表
查看>>
List与数组的相互转换
查看>>
Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
查看>>
socketserver模块使用方法
查看>>
json模块
查看>>
各型号英特尔CUP的功率
查看>>
scanf()中的%c 不能正常输入的问题
查看>>
PHP学习1——快速入门
查看>>
面试发散思维
查看>>
java日志commons-logging/log4j/slf4j/logBack需要知道的几件事
查看>>
TypeScript 2019 路线图:更效率,更易用!
查看>>
Springboot从HellWorld开始
查看>>
Apache uimaFIT 3.0.0 发布,Java 的 UIMA 注解类
查看>>
用js来实现那些数据结构15(图01)
查看>>
web前端学习:React是什么,为什么要使用它?
查看>>
常见排序算法及对应的时间复杂度和空间复杂度
查看>>
业界 | 在德州叫一辆自动驾驶车,Drive.ai安排了7辆无人车展开真实试验
查看>>
实时数据平台设计:解决从OLTP到OLAP实时流转缺失
查看>>
三家公司在SD-WAN方面的新动作
查看>>
C#在PDF中如何以不同颜色高亮文本
查看>>