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数据出错问题的更多相关文章

  1. mysql存储过程批量向表插入数据

    业务需要,往某个表中批量插入数据,使用存储过程插入 首先,要建立一张mysql表,表明为phone_number, 三个字段,id 自增,number 就是要插入的表格,is_used 表示十分已经使 ...

  2. Jeecg 如何执行批量insert或者update操作,高效率

    方法:org.jeecgframework.core.common.dao.jdbc.SimpleJdbcTemplate.batchUpdate     原理: 基于springjdbc封装,批量提 ...

  3. Oracle表格字段采用sequence进行自增长时,采用Dbutils进行insert或update数据时的处理技巧

    // 定义插入记录的方法 public Teacher insert(String name, String gender, Double score) { // 获得连接 Connection co ...

  4. mysql 数据库批量刷新表字段数据

    UPDATE a,bSET b.studentno = a.studentnumber WHERE b.studentno IS NULL AND a.p_id = b.p_id

  5. MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理

    MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...

  6. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  7. MySQL中select、insert、update批量操作语句

    项目中经常的需要使用批量操作语句对数据进行操作,使用批量语句的时候需要注意MySQL数据库的条件限制,这里主要是数据的大小限制,这里对批量插入.批量查找及批量更新的基础操作进行下简单的汇总. 1.批量 ...

  8. 【mysql】批量更新数据

    概述 批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为: INSERT ... ON DUPLICATE KEY UPDATE Syntax 可参见官方网站:inser ...

  9. mysql 批量 insert 数据丢失问题

    这两天发现mysql 批量insert 比如600条数据后,页面马上select就查询到580条,但是等几秒钟再查询就有600条(也有部分情况是永久只能查到580条了) 查看mybatis的日志发现循 ...

  10. MySQL加快批量更新 UPDATE优化

    如果是更新为同样的内容,没啥难度,直接在where里面下功夫就好了,大家都懂,我要说的是针对更新内容不一样的情况 首先,先看看网上转载的方法: mysql 批量更新如果一条条去更新效率是相当的慢, 循 ...

随机推荐

  1. 聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现

    本文基于 Netty 4.1.56.Final 版本进行讨论 时光芿苒,岁月如梭,好久没有给大家更新 Netty 相关的文章了,在断更 Netty 的这段日子里,笔者一直在持续更新 Linux 内存管 ...

  2. RabbitMq高级特性之消费端限流 通俗易懂 超详细 【内含案例】

    RabbitMq高级特性之消费端限流 介绍 消息队列中囤积了大量的消息, 或者某些时刻生产的消息远远大于消费者处理能力的时候, 这个时候如果消费者一次取出大量的消息, 但是客户端又无法处理, 就会出现 ...

  3. Windows中Powershell中的 rm -rf 等效命令

    Remove-Item  -Recurse  -Force  <要删除的目录> 可以简写为: rm -r -fo  <要删除目录>

  4. C++20新特性

    C++20新特性 语言特性 协程 concept概念 指定初始化器 lambda表达式模板语义 范围for循环增加初始化器 [[likely]] [unlikely]属性 废弃隐式捕获this 非类型 ...

  5. java_GUI2

    package GUi;import java.awt.*;public class GuI2 { public static void main(String[] args) { MyFrame n ...

  6. SAR靶机笔记

    SAR 靶机笔记 概述 SAR 是 Vulnhub 上的靶机,大家可以去 vulnhub 网站上去进行下载. 这里有链接: https://download.vulnhub.com/sar/sar.z ...

  7. Adobe Photoshop cc2022 Mac中文破解版下载安装

    PS2024 for Mac,我这个版本是Mac版25.2,大小4.03G,支持intel/M1/M2/M3芯片,最低系统需求:13.4以上,不限速下载地址还是放在最后. 然后安装总共有三个步骤,尤其 ...

  8. 分库分表后全局唯一ID的四种生成策略对比

    分库分表之后,ID主键如何处理? 当业务量大的时候,数据库中数据量过大,就要进行分库分表了,那么分库分表之后,必然将面临一个问题,那就是ID怎么生成?因为要分成多个表之后,如果还是使用每个表的自增长I ...

  9. 【Docker学习系列】Docker学习2-docker设置阿里云镜像加速器

    在上一篇中,我们学会了在centos中安装docer.我们知道,镜像都是外网的,镜像一般都是比较大的,因为种种原因,我们知道,从外网下载比较慢的.所以,本文,凯哥就介绍怎么将docker的镜像拉取设置 ...

  10. Mysql table 调整table的字符集和校对规则

    ALTER TABLE `xxxx`.`xxx` CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_0900_ai_ci ;