多个接口更新单表频繁创建更新时有unique key冲突

php中文网
发布: 2016-06-06 20:38:39
原创
1132人浏览过

环境:mysql5.6、php5.5
多个api接口同时对单表c_point表更新创建数据,

c_point表结构:
id primary key int(11) auto incrment,
uid char(32) not null unique key,
temporary decimal(10,2) not null,
pressure decimal(10,2) not null,
updated_at timestamp not null default current_timestamp on update current_timestamp

计算规则:
uid = md5(deviceid+pointid)

接口A:
更新c_point表的temporary字段,如果没有则创建一条新纪录。
接口B:
更新c_point表的pressure,如果没有则创建一条新纪录。

接口A、B在插入前都有select检查。

Cutout.Pro
Cutout.Pro

AI驱动的视觉设计平台

Cutout.Pro 331
查看详情 Cutout.Pro

当A、B接口同时调用时出现A和B同时进行insert操作,报出
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '8b3e94ae3568001854dd7c112702dd36' for key 'uid'

针对这种多个接口针对同一个表的同一个row创建更新时怎么处理,能让两个接口都更新各自的字段?

结论:
1)插入前先select,再insert(目前的场景不合适,但仍然有必要加上去)
2)try catch 解析错误码

<code>  $duplicate = false;
  $entry      = $key = null;
  $inner      = $e->getInner(); 
  $info       = $inner->errorInfo;

  // Check if mysql error is for a duplicate key
  if (in_array($info[1], array(1062, 1022, 1558))) {
        $duplicate = true;
        preg_match("/'(.*)'.*'(.*)'/", $info[2], $matches);
        $entry = $matches[1];
        $key = $matches[2];
  }
</code>
登录后复制

3)insert ignore
4) on duplicate key

具体问题需要具体分析

http://mikefenwick.com/blog/insert-into-database-or-return-id-of-duplicate-row-in-mysql/

回复内容:

环境:mysql5.6、php5.5
多个api接口同时对单表c_point表更新创建数据,

c_point表结构:
id primary key int(11) auto incrment,
uid char(32) not null unique key,
temporary decimal(10,2) not null,
pressure decimal(10,2) not null,
updated_at timestamp not null default current_timestamp on update current_timestamp

计算规则:
uid = md5(deviceid+pointid)

接口A:
更新c_point表的temporary字段,如果没有则创建一条新纪录。
接口B:
更新c_point表的pressure,如果没有则创建一条新纪录。

接口A、B在插入前都有select检查。

当A、B接口同时调用时出现A和B同时进行insert操作,报出
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '8b3e94ae3568001854dd7c112702dd36' for key 'uid'

针对这种多个接口针对同一个表的同一个row创建更新时怎么处理,能让两个接口都更新各自的字段?

结论:
1)插入前先select,再insert(目前的场景不合适,但仍然有必要加上去)
2)try catch 解析错误码

<code>  $duplicate = false;
  $entry      = $key = null;
  $inner      = $e->getInner(); 
  $info       = $inner->errorInfo;

  // Check if mysql error is for a duplicate key
  if (in_array($info[1], array(1062, 1022, 1558))) {
        $duplicate = true;
        preg_match("/'(.*)'.*'(.*)'/", $info[2], $matches);
        $entry = $matches[1];
        $key = $matches[2];
  }
</code>
登录后复制

3)insert ignore
4) on duplicate key

具体问题需要具体分析

http://mikefenwick.com/blog/insert-into-database-or-return-id-of-duplicate-row-in-mysql/

不需要使用 select 检查。直接插,冲突了就表明已经存在了,按已经存在的逻辑做。

PS: 请认真排版你的问题好不好,刚刚因为排版不清晰看错了。

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号