PHP mysql 大量批量insert或update数据出错问题
UPDATE users SET age = 30 WHERE name = 'Alice';
UPDATE users SET age = 25 WHERE name = 'Bob';
UPDATE users SET age = 35 WHERE name = 'Charlie';
以上代码会导致并发性问题,因为多个更新语句可能会同时执行,导致数据错乱。
解决办法:
1、使用锁定
LOCK TABLES users WRITE;
UPDATE users SET age = 30 WHERE name = 'Alice';
UPDATE users SET age = 25 WHERE name = 'Bob';
UPDATE users SET age = 35 WHERE name = 'Charlie';
UNLOCK TABLES;
2、使用事务
START TRANSACTION;
UPDATE users SET age = 30 WHERE name = 'Alice';
UPDATE users SET age = 25 WHERE name = 'Bob';
UPDATE users SET age = 35 WHERE name = 'Charlie';
COMMIT;
一般使用事务,PHP操作:
$sqls=["START TRANSACTION"];//开启事务避免出错
for($datas as $d){
$sql="............";
array_push($sqls,$sql);
}
array_push($sqls,"COMMIT");
$sqls=implode(";",$sqls);
$result=$pdo->query($sqls);
或者:
$db->query('START TRANSACTION');
$db->query('update member set money=money+'.$money.' where memberId='.$memberId);
$db->query('insert into mem_log(money) values('.$money.')');
$db->query('commit');
或者:
$stmt = $pdo->prepare("INSERT INTO a_salary_test (name,dpname,year,month) VALUES (?,?,?,?)");
$stmt->execute(array("ha","ddd",2000,1));
$stmt->execute(array("ha2","ddd2",2002,2));
//批量
$pdo->beginTransaction();
$stmt->execute(array("ha3","ddd",2000,1));
$stmt->execute(array("ha4","ddd2",2002,2));
$pdo->commit();
//execute是执行预处理
//$pdo->exec是直接执行
try {
// 开启事务
$pdo->beginTransaction();
// 执行一些SQL操作
$pdo->exec("INSERT INTO table1 (column1) VALUES ('value1')");
$pdo->exec("UPDATE table2 SET column2 = 'value2' WHERE id = 1");
// 提交事务
$pdo->commit();
} catch (Exception $e) {
// 发生错误,回滚事务
$pdo->rollBack();
// 处理错误,例如打印错误信息
echo "Error: " . $e->getMessage();
}
大量插入建议:
<?php
// 数据库连接配置
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = ''; try {
// 创建PDO对象
$pdo = new PDO($dsn, $username, $password); // 数据准备
$data = [
['name' => '张三', 'age' => 20],
['name' => '李四', 'age' => 25],
['name' => '王五', 'age' => 30],
]; // 开启事务
$pdo->beginTransaction(); // 预处理插入语句
$stmt = $pdo->prepare('INSERT INTO users (name, age) VALUES (:name, :age)'); // 执行批量插入
foreach ($data as $item) {
$stmt->bindValue(':name', $item['name']);
$stmt->bindValue(':age', $item['age']);
$stmt->execute();
} // 提交事务
$pdo->commit(); echo "批量插入成功!";
} catch (PDOException $e) {
// 回滚事务
$pdo->rollBack(); echo "插入失败:" . $e->getMessage();
}
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value); // 插入一行
$name = 'one';
$value = 1;
$stmt->execute(); // 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>
大量修改建议:
<?php
// 数据库连接配置
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = ''; try {
// 创建PDO对象
$pdo = new PDO($dsn, $username, $password); // 数据准备
$data = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五'],
]; // 开启事务
$pdo->beginTransaction(); foreach ($data as $item) {
// 预处理更新语句
$stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
$stmt->bindValue(':name', $item['name']);
$stmt->bindValue(':id', $item['id']);
$stmt->execute();
} // 提交事务
$pdo->commit(); echo "批量更新成功!";
} catch (PDOException $e) {
// 回滚事务
$pdo->rollback(); echo "更新失败:" . $e->getMessage();
}
PHP mysql 大量批量insert或update数据出错问题的更多相关文章
- mysql存储过程批量向表插入数据
业务需要,往某个表中批量插入数据,使用存储过程插入 首先,要建立一张mysql表,表明为phone_number, 三个字段,id 自增,number 就是要插入的表格,is_used 表示十分已经使 ...
- Jeecg 如何执行批量insert或者update操作,高效率
方法:org.jeecgframework.core.common.dao.jdbc.SimpleJdbcTemplate.batchUpdate 原理: 基于springjdbc封装,批量提 ...
- Oracle表格字段采用sequence进行自增长时,采用Dbutils进行insert或update数据时的处理技巧
// 定义插入记录的方法 public Teacher insert(String name, String gender, Double score) { // 获得连接 Connection co ...
- mysql 数据库批量刷新表字段数据
UPDATE a,bSET b.studentno = a.studentnumber WHERE b.studentno IS NULL AND a.p_id = b.p_id
- MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...
- mysql根据查询结果批量更新多条数据(插入或更新)
mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...
- MySQL中select、insert、update批量操作语句
项目中经常的需要使用批量操作语句对数据进行操作,使用批量语句的时候需要注意MySQL数据库的条件限制,这里主要是数据的大小限制,这里对批量插入.批量查找及批量更新的基础操作进行下简单的汇总. 1.批量 ...
- 【mysql】批量更新数据
概述 批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为: INSERT ... ON DUPLICATE KEY UPDATE Syntax 可参见官方网站:inser ...
- mysql 批量 insert 数据丢失问题
这两天发现mysql 批量insert 比如600条数据后,页面马上select就查询到580条,但是等几秒钟再查询就有600条(也有部分情况是永久只能查到580条了) 查看mybatis的日志发现循 ...
- MySQL加快批量更新 UPDATE优化
如果是更新为同样的内容,没啥难度,直接在where里面下功夫就好了,大家都懂,我要说的是针对更新内容不一样的情况 首先,先看看网上转载的方法: mysql 批量更新如果一条条去更新效率是相当的慢, 循 ...
随机推荐
- 聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现
本文基于 Netty 4.1.56.Final 版本进行讨论 时光芿苒,岁月如梭,好久没有给大家更新 Netty 相关的文章了,在断更 Netty 的这段日子里,笔者一直在持续更新 Linux 内存管 ...
- RabbitMq高级特性之消费端限流 通俗易懂 超详细 【内含案例】
RabbitMq高级特性之消费端限流 介绍 消息队列中囤积了大量的消息, 或者某些时刻生产的消息远远大于消费者处理能力的时候, 这个时候如果消费者一次取出大量的消息, 但是客户端又无法处理, 就会出现 ...
- Windows中Powershell中的 rm -rf 等效命令
Remove-Item -Recurse -Force <要删除的目录> 可以简写为: rm -r -fo <要删除目录>
- C++20新特性
C++20新特性 语言特性 协程 concept概念 指定初始化器 lambda表达式模板语义 范围for循环增加初始化器 [[likely]] [unlikely]属性 废弃隐式捕获this 非类型 ...
- java_GUI2
package GUi;import java.awt.*;public class GuI2 { public static void main(String[] args) { MyFrame n ...
- SAR靶机笔记
SAR 靶机笔记 概述 SAR 是 Vulnhub 上的靶机,大家可以去 vulnhub 网站上去进行下载. 这里有链接: https://download.vulnhub.com/sar/sar.z ...
- Adobe Photoshop cc2022 Mac中文破解版下载安装
PS2024 for Mac,我这个版本是Mac版25.2,大小4.03G,支持intel/M1/M2/M3芯片,最低系统需求:13.4以上,不限速下载地址还是放在最后. 然后安装总共有三个步骤,尤其 ...
- 分库分表后全局唯一ID的四种生成策略对比
分库分表之后,ID主键如何处理? 当业务量大的时候,数据库中数据量过大,就要进行分库分表了,那么分库分表之后,必然将面临一个问题,那就是ID怎么生成?因为要分成多个表之后,如果还是使用每个表的自增长I ...
- 【Docker学习系列】Docker学习2-docker设置阿里云镜像加速器
在上一篇中,我们学会了在centos中安装docer.我们知道,镜像都是外网的,镜像一般都是比较大的,因为种种原因,我们知道,从外网下载比较慢的.所以,本文,凯哥就介绍怎么将docker的镜像拉取设置 ...
- Mysql table 调整table的字符集和校对规则
ALTER TABLE `xxxx`.`xxx` CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_0900_ai_ci ;