`
javaFlood
  • 浏览: 10229 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

mysql并发插入

阅读更多
通常我们对表进行插入的时候,是这样操作的:
start transaction;
select * from t where id='x';
if not exist:
  insert into t(id,c) values('x',1);
else:
  update t set c=c+1 where id='x';
commit;


但这样会存在一个问题,如果两个id='x'的并发插入同时到达,那么select的时候都没有查到,insert时就会发生主键冲突。如何做到两个并发插入顺序操作并且下一个插入基于上一个插入的结果进行更新呢?因为mysql RR模式下,事务之间是相互隔离的,事务1如果已经插入成功并且提交,在事务2中,第一次没有select到数据,第二次select结果也是一样的(如果没有update)。另一个问题是,如果感知到别的事务已经插入了数据。研究了一下mysql,总结了一下:
start transaction;
select * from t where id='x'; // 获取数据
if exist:
 update t set c=c+1 where id='x'; //如果存在可以直接更新
 return;
rows=insert ignore into t(id,c) values('x',1); // insert ignore,如果不存在则返回1表示插入成功,如果已存在会返回0
if rows==1:
  return; // 插入了当前不存在的行,可以返回
else rows==0:  // 表示插入时数据库已经存在了id='x'的行
  update set d='xxx' where id='x'; // 更新一个不太重新的列,例如时间,获取锁,因为update之后再select可以获取到最新的行并且锁住记录
  select * from t where id='x'; // 此时获取到的就是最新的行,并且其他update都被锁住
  nc=c; // 程序拿到的c就是当前最新的c
  nc+=1; //在应用程序中重新计算
  update t set c=nc where id='x'; // 最后更新回去
commit;


使用mysql 命令演示一下:
  • 大小: 51.4 KB
分享到:
评论

相关推荐

    深入mysql并发插入优化详解

    本篇文章是对mysql并发插入优化进行了详细的分析介绍,需要的朋友参考下

    记一次 MySQL 并发时插入重复数据的解决方案

    问题描述 首先,看一下我的表结构。 CREATE TABLE `coolq_qq_group_message_receiver` ( `id` int(11) NOT NULL AUTO_INCREMENT, `qq_group_number` varchar(12) NOT NULL COMMENT 'QQ群号码', ...

    MySQL高并发下生成唯一订单号的存储过程

    这个是用mysql写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的;原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于数据表设置了主键,也就是当数据表中存在...

    并发环境下mysql插入检查方案

    主要介绍了并发环境下mysql插入检查方案的相关资料,需要的朋友可以参考下

    mysql 数据插入优化方法

    在MyISAM里读写操作是串行的,但当对同一个表进行查询和插入操作时,为了降低锁竞争的频率,根据concurrent_insert的设置,MyISAM是可以并行处理查询和插入的: 当concurrent_insert=0时,不允许并发插入功能。...

    shell的多线程&当前文件夹下批量插入MySQL

    shell的多线程,以及使用多线程编写shell脚本实现当前文件夹下批量插入MySQL。

    PHP利用Mysql锁解决高并发的方法

    主要介绍了PHP利用Mysql锁解决高并发的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?今天小编通过本教程给大家介绍下

    php并发对MYSQL造成压力的解决方法

    PHP页面有一个浏览量统计每秒有200并发,造成...你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升

    自整理! 最全mysql笔记

    - 如果要提供提交、回滚、崩溃恢复能力的事物...- 如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive

    2023MySQL高频面试题

    MySQL是目前应用最广泛的关系型数据库之一,因此在企业招聘中,MySQL面试题也是非常常见的。以下将对MySQL面试题作一个简要的概述。...例如,在高并发场景下如何优化MySQL性能?如何处理大量数据的插入操作?如何避免死

    PHP+MySQL高并发加锁事务处理问题解决方法

    本文实例讲述了PHP+MySQL高并发加锁事务处理问题解决方法。分享给大家供大家参考,具体如下: 1、背景: 现在有这样的需求,插入数据时,判断test表有无username为‘mraz’的数据,无则插入,有则提示“已插入”,...

    mysql数据库my.cnf配置文件

    # MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,...

    MySQL死锁的产生原因以及解决方案

    当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在...

    基于Java(SSM)+MySQL搭建的高并发秒杀系统【100012604】

    秒杀操作要做两件事情,一是商品减库存,二是插入秒杀详情:1. 系统异常:服务器的一些异常不可避免;2. 秒杀关闭异常:当进行减库存操作时,如果此时秒杀已经关闭或者库存为0时,此时减库存会失败,此时需要处理;3...

    MySQL大数据量快速插入方法和语句优化

    MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够对您有所收获!插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例:连接:(3)发送查询给服务器:...

    基于SSM框架实现的高并发商品秒杀系统.zip

    c3p0作为连接池,Redis为缓存实现高并发 ,同时通过MySQL优化降低了网络延迟与GC的影响.DAO,SERVICE等逻辑代码均有JUnit单元测试 后台API采用RESTful设计风格,基于Maven构建 MySQL 是一款广受欢迎的开源关系型数据库...

    基于django+mysql的商品推荐系统.zip

    它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持...

    基于Koa2+MySQL博客系统.zip

    它完全支持结构化查询语言(SQL),允许用户进行数据查询、插入、更新、删除、创建和管理数据库结构等操作。SQL标准的广泛支持使得MySQL易于学习,且与其他关系型数据库系统有良好的互操作性。 存储引擎 MySQL支持...

Global site tag (gtag.js) - Google Analytics