文档章节

Mysql 先SELECT 后UPDATE 问题

汤汤圆圆
 汤汤圆圆
发布于 2016/06/29 10:04
字数 483
阅读 196
收藏 4

最近做一个统计;需要把一个字段(存放数据是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. 如果写操作频繁并且冲突比例很高,那么适合用悲观写独占锁

mysql锁相关学习

本文转载自:http://www.jb51.net/article/50103.htm

汤汤圆圆

汤汤圆圆

粉丝 11
博文 82
码字总数 26104
作品 0
昌平
程序员
私信 提问
You can't specify target table for update....

这篇文章主要介绍了mysql中You can’t specify target table for update in FROM clause错误解决方法,需要的朋友可以参考下 mysql中You can't specify target table for update in FROM cla......

沧海一刀
2018/06/26
286
0
mysql中select for update锁的问题

mysql中select for update锁的问题 无标题2017-12-053 阅读 mysql 在日常关于资金业务的开发过程中,涉及到数据库的操作时我们经常按照一查二锁三写的套路,可能在加锁后还需要查询一些数据,...

无标题
2017/12/05
0
0
mysql中You can’t specify target table for update in FROM clause错误解决方法

mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。 例如下面这个sql: 处理方法: 也就是说...

时刻在奔跑
2018/04/19
32
0
MySQL SELECT ... FOR UPDATE

MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... LO...

克温s
2016/05/03
66
0
MySQL 使用SELECT ... FOR UPDATE

MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... LO...

恶魔永生
2015/01/17
274
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
259
5
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部