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 批量更新如果一条条去更新效率是相当的慢, 循 ...
随机推荐
- 推荐一款界面优雅、功能强大的 .NET + Vue 权限管理系统
前言 今天推荐一款用 .NET 和 Vue3 实现的开源权限管理系统.它的界面清爽干净,功能强大,还具备灵活的角色权限分配功能,能够满足不同规模企业的管理需求.无论你是开发新手还是大神,都能轻松上手, ...
- iOS开发基础148-ABM vs MDM
Apple Business Manager (ABM) vs. Mobile Device Management (MDM) Apple Business Manager (ABM) 优点: 集中管 ...
- [POI2008] POC-Trains 题解
前言 题目链接:洛谷. 时间复杂度和输入同阶的做法. 题意简述 有 \(n\)(\(n \leq 10^3\))个长 \(m\) 的字符串,\(q\)(\(q \leq 10^5\))次操作,交换两个 ...
- 汇编跳转指令B、BL、BX、BLX 和 BXJ的区别
跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: (1) 使用专门的跳转指令. (2) 直接向程序计数器 PC 写入跳转地址值. 通过向程序计数器 PC 写入跳转地 ...
- Oracle数据库自动备份
1.bat脚本 格式为ANSI格式 set CURDATE=%date:~0,4%%date:~5,2%%date:~8,2% set CURMON=%date:~0,4%%date:~5,2% se ...
- 万字长文带你窥探Spring中所有的扩展点
写在前面 Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片.Springboot更是封装了Spring,遵循约定大于配置,加上自动装配 ...
- LeetCode题集-1- 两数之和
这个题目是什么意思呢?简单来说就是在一个数组中找出两个元素,使其和为我们设定的值,并且每个元素只能用一次. 如下图具体示例: 到这里不知道你是否已经有解题思路了呢? 解法一:双层循环 我第一反应就是双 ...
- C# 泛型对象和DataTable之间的相互转换
应用场景 实际开发场景下会经常出现DataTable和List对象需要相互转换的时候,通过方法提取避免重复造轮子 List转换成DataTable 基本思路: 向DataTable里面添加新的数据内容 ...
- 不升级 POI 版本,如何生成符合新版标准的Excel 2007文件
开心一刻 记得小时候,家里丢了钱,是我拿的,可爸妈却一口咬定是弟弟拿的 爸爸把弟弟打的遍体鳞伤,弟弟气愤的斜视着我 我不敢直视弟弟,目光转向爸爸说到:爸爸,你看他,好像还不服 问题描述 项目基于 PO ...
- 如何将图片转换为向量?(通过DashScope API调用)
本文介绍如何通过模型服务灵积DashScope将 图片转换为向量 ,并入库至向量检索服务DashVector中进行向量检索. 模型服务灵积DashScope,通过灵活.易用的模型API服务,让各种模态 ...