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. [POI2008] POC-Trains 题解

    前言 题目链接:洛谷. 时间复杂度和输入同阶的做法. 题意简述 有 \(n\)(\(n \leq 10^3\))个长 \(m\) 的字符串,\(q\)(\(q \leq 10^5\))次操作,交换两个 ...

  2. 在oracle中将一行字符串拆分成多行

    例如,有如下一张表,表名为bk_test.插入了以下数据: CREATE TABLE BK_TESK(id varchar2(10),s varchar2(20)); insert into BK_T ...

  3. java关于二维数组的操作

    代码: ''' package tests; public class Yanghui { public static void main(String[] args) { //声明二维数组的三种方式 ...

  4. Vue-方法与事件

    基本用法 监听点击事件 v-on 缩写:@ 预期:Function | Inline Statement | Object 参数:event 修饰符: .stop - 调用 event.stopPro ...

  5. QT基础-弹出框(信息框,模态框,操作框)

    学习前端知识的时候就了解到让用户使用的界面一定要足够清晰,因为你永远不知道用户会以何种方式打开你开发的软件,所以莫泰提示框就很重要了.下面将会介绍几本的集中模态对话框,用来提升用户体验! 1.模态框 ...

  6. 【问题解决】git status中文文件名乱码

    问题复现 解决办法 在git bash中直接执行如下命令 git config --global core.quotepath false 原因 通过 git config --help 可以查看到以 ...

  7. C#数据结构与算法实战入门指南

    前言 在编程领域,数据结构与算法是构建高效.可靠和可扩展软件系统的基石.它们对于提升程序性能.优化资源利用以及解决复杂问题具有至关重要的作用.今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望 ...

  8. 05-canvas绘制简单图形之三角形

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  9. SMU 2024 spring 天梯赛2

    SMU 2024 spring 天梯赛2 7-1 计算指数 - SMU 2024 spring 天梯赛2 (pintia.cn) #include <bits/stdc++.h> usin ...

  10. ZPL Viewer工具网站

    新上线的ZPL Viewer工具网站 大家好! 在工作中,我们经常需要设计和预览ZPL(Zebra Programming Language)文件.以前,我一直使用ZPL Design这类工具,但后来 ...