mysql并发更新

常见方案

乐观锁
select * from tab1 where id = ?;
update tab1 set col1 = ? where id = ? and version = ?;
  • 缺点

    • 在高并发下可能更新失败,所以需要通过重试(select...,update...)来提高更新成功率
读取锁定MySQL 8.0 Reference Manual / ... / Locking Reads
select * from tab1 where id = ? for update;
update tab1 set col1 = ? where id = ?;
  • 注意

    • select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。
  • 优点
    • 无需重试
  • 缺点
    • 可能导致其它相关的(包含该for update行内容)并发操作阻塞
条件更新MySQL 8.0 Reference Manual / ... / UPDATE Syntax
update tab1 set col1 = col1-1 where col1>1
  • 优点

    • 简单,一条语句即可实现
    • 无需重试
  • 缺点
    • 无法获取更新前后col1字段的值
    • 只适用于简单的where条件
异步更新
  • 优点

    • 减少客户端等待时间
    • 提高服务端的并发量
    • 把并发操作转化为更简单的同步操作
  • 缺点
    • 服务端和客户端需要支持异步消息通知,因为异步操作的结果只能异步返回
    • 需要使用消息队列和异步消息通知,如果没有现成框架支持,代码实现会更加复杂
    • 不支持其他需要依赖更新结果的逻辑,除非所有逻辑都异步化
参考

mysql并发更新的更多相关文章

  1. mysql并发更新问题

    问题背景: 假设MySQL数据库有一张会员表vip_member(InnoDB表),结构如下:   当一个会员想续买会员(只能续买1个月.3个月或6个月)时,必须满足以下业务要求: •如果end_at ...

  2. mysql并发量过大造成 update语句更新错误

    mysql并发量过大造成 update语句更新错误 在同一字段的时候更新的时候 如果并发量太大 就会更新错误 这个时候只能用 swoole 消息队列更新

  3. mysql查询更新时的锁表机制分析

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  4. php mysql 丢失更新

    php mysql 丢失更新问题,搜索整个互联网,很少有讲到,也许和php程序员出身一般都是非科班出身有关系吧. 另外php程序一般都是简单数据,很少有并发一致性问题,所以大家都没有谁专门提出这个问题 ...

  5. mysql查询更新时的锁表机制分析(只介绍了MYISAM)

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  6. mysql 插入/更新数据

    mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO ...

  7. mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = ...

  8. 转载:mysql update更新带子查询的实现方式

    出自:http://576017120.iteye.com/blog/1947154 mysql中更新时不能直接将更新的表作为查询的表,可以通过临时中间表的形式. 总结一下: 一:单表更新时 例如: ...

  9. mysql级联更新的两种方式:触发器更新和外键

    1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...

随机推荐

  1. [数]数学系列预习->补水题ver.

    ---恢复内容开始--- 话说要学反演了,contest一题都搞不定,整理题目暂且搁置,数学笨蛋来学一下数学_(:з」∠)_ ---恢复内容结束--- 是的,预习看了半天教学,没有整理,做题又都不会, ...

  2. idea安装proto插件后不能识别.proto文件解决方案

     just had a try and it worked well. Could you please check "File Types" in IDEA? Open &quo ...

  3. cdh日常维护常见问题及解决方案

    为数据节点添加新硬盘 - 挂载硬盘到指定文件夹.如`/dfs_diskb`: - 打开cloudera manager -> hdfs -> 配置 -> DataNode -> ...

  4. c++ <stdarg.h> 解决变参问题的宏定义;

    在读程序的过程中遇到的va_list类型不认识,百度得到的.:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html (此例子 ...

  5. Adobe Flash Player 29.0.0.140官方正式版

    Adobe Flash Player 29 正式版例行更新,v29.0.0.140 这是最新详细版本号,Adobe采取和微软相似的更新策略,在每个月的第二个周二为产品发布安全更新.Adobe® Fla ...

  6. 责任链模式(Chain of Responsibility)

    定义:为一个请求定义含有链状关系的接受对象,基于请求的类型,松耦合发送者和接受者之间的关系. 实现方式: 首先定义一个抽象类,包括一个公共抽象行为和决定子类链状关系的属性,然后创建一系列对象继承这个抽 ...

  7. 新手学习之浅析一下c/c++中的指针

    一.我们先来回忆一下指针的概念吧,方便下面的介绍 指针是存放地址值的变量或者常量.例如:int a=1;&a就表示指针常量(“&”表示取地址运算符,也即引用).int *b,b表示的是 ...

  8. js中bind的用法,及与call和apply的区别

    call和apply的使用和区别不再做阐述,可以参考我的另一篇随笔<JavaScript中call和apply方法的使用>(https://www.cnblogs.com/lcr-smg/ ...

  9. java中List按指定大小分割

    之前写过的代码,几个月后遇到类似的功能,感觉很熟悉,稍微费些劲也能做到,但是觉得有些不甘.明明之前整理好的为什么要重新做?百度参考其他人的思路感觉不是很顺心,个人原因吧.于是翻箱倒柜找出以前的代码,贴 ...

  10. oracle 根据一个表生成另一个新表和一个现有表给一个新的表赋值

    1,添加表B ,和A表表结构相同(带数据) create table B  as select * from A; 2,添加表B ,和A表表结构相同(不带带数据) create table B  as ...