首页 > 其他分享 >update 修改单表的多个字段,造成数据混乱

update 修改单表的多个字段,造成数据混乱

时间:2025-01-18 10:21:47浏览次数:1  
标签:10 keme update t1 单表 混乱 select localhost

1、问题描述

在某个环境里面,需要修改单个表的多个字段,造成了数据混乱,跟理想修改的数据不一致。

1.1 模拟问题现象

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 # 注意: 创建的表没有主键,且 t1 表是 innodb 引擎   root@localhost [keme]>create table t1 (a int,b int,primary key(a)); Query OK, 0 rows affected (0.02 sec) root@localhost [keme]>insert into  t1  values (1,10),(2,20),(3,30); Query OK, 3 rows affected (0.02 sec) Records: 3  Duplicates: 0  Warnings: 0   root@localhost [keme]>select from t1; +------+------+ | a    | b    | +------+------+ |    1 |   10 | |    2 |   20 | |    3 |   30 | +------+------+   # 进行修改多个字段 root@localhost [keme]>update t1 set a=a+1,b=a+10 where a=2; Query OK, 1 row affected (0.01 sec) Rows matched: 1  Changed: 1  Warnings: 0     root@localhost [keme]>select from t1; +------+------+ | a    | b    | +------+------+ |    1 |   10 | |    3 |   13 | |    3 |   30 | +------+------+ 3 rows in set (0.00 sec)

 

修改的条件是a=2,为啥修改的结果是(3,13),不应该是(3,12)吗?

是不是很多人以为修改的结果是(3,12),是不是感觉数据是乱的,如果一条数据改回正常还是挺简单,关键数据量很多改的就费劲了啊,时间还长。

 

 1.2 问题故障原因

因为 update  是当前读,读取的是记录数据的最新版本,就是  

1 2 3 4 update t1 set a=a+1,b=a+10 where a=2; update a=a+1 因为要做当前读  现在a =2 +1 后  a=3 ,保证最新值 在做  b=a+10  也需要读到a值的最新的值 还要加锁, 现在a的值已经变成3 ,  在加10不就变成13

 

1.3 解决故障

1 2 3 4 5 6 7 8 9 10 11 # 我先改回原来数据 root@localhost [keme]>update t1 set a=2,b=20 where a=3 and b=13;     # 可以把 a 列暂存在一个临时变量里 root@localhost [keme]>select into @a from t1 where a=2;   # 修改数据 root@localhost [keme]>update t1 set a=@a+1,b=@a+10 where a=@a;   #验证结果 是不是 (3,12)

 

 

2、问题总结

我们需要知道一些相关原理: 快照读,当前读

2.1、快照读(select)

执行select的时候,innodb默认会执行快照读,快照读,也就是读取快照的数据,数据虽然是一致的,但是数据是历史数据。

快照读:只是简单的 select ,不包括 select ... lock in share mode, select ... for update

2.2、当前读

select ... lock in share mode

select ... for update

insert

update

delete

当你执行这几个操作的时候默认会执行当前读,也就是会读取最新的记录,也就是别的事务提交的数据你也可以看到。

update 执行当前读,然后把返回的数据加锁,之后执行update。

加锁是防止别的事务在这个时候对这条记录做什么,默认加的是排他锁,也就是只允许读,其他都不可以,这样就可以保证数据不会出错了。

 

3、延伸阅读

上面的情况是:

  • innodb 引擎
  • 表中无主键

如果表中有主键,或者是其他引擎,正确操作,请看下面的大神文章

标签:10,keme,update,t1,单表,混乱,select,localhost
From: https://www.cnblogs.com/shujuyr/p/18678095

相关文章

  • Sample Teamcenter SOA Java program : CreateOrUpdateBOMStructure
    SampleTeamcenterSOAJavaprogram:CreateOrUpdateBOMStructure  Solution/* This example was tested with the SOAJava HelloTeamcenter example provided in the soa_client.zip file.It assumes you have the HelloTeamcen......
  • SQL-update多条Select出来的数据.090205
    好多朋友喜欢用游标解决此问题,但是执行速度狂慢!其实解决起来很简单了:先来个简单的:把FLowER的Am_employee表的email,dept_id,ext_no多条数据按emp_no对应update到EmpBaseInfo表中:update EmpBaseInfo set email=b.Mail_account,dept_id=b.dept_code,ext_no=b.ext_nofro......
  • 任务管理混乱?看看这些比 Excel 更高效的智能管理工具!
    在当今数字化时代,企业和团队面临着日益复杂的任务管理挑战。传统的Excel管理方式,虽然曾经是数据处理和任务安排的得力助手,但随着业务规模的扩大和工作流程的精细化,其局限性愈发明显。许多有经验的专业人士都在寻找更高效、更智能的任务管理解决方案,今天我们就来探讨一下这方面的......
  • docker update 参数详解
    https://www.cnblogs.com/zwh0910/p/16386029.htmldockerupdate--restart=alwayscontainer一、dockerupdatedockerupdate:更新一个或多个容器的配置。语法dockerupdate[OPTIONS]CONTAINER[CONTAINER...]OPTIONS说明名称描述--blkio-weight阻塞IO(......
  • mysql如果updatedate is null就把createdate设置到updatedate
      mysql>select*frome_task3instance_struct_8whereupdatedateisnull;+---------------------+----------------+--------------------+------------------+----------+--------------+----------+-----------+--------------------+----------+-------+--------......
  • 告别混乱!电商新年团队协作工具助你轻松应战
    看板软件凭借其直观的可视化界面与卓越的协作功能,在新年期间对电商团队而言显得尤为重要,它如同一股强大的助力,极大地提升了团队协作与沟通的效率,尤其是在工作量骤增的这一特殊时段。电商团队想要迎战新年,获得高效率作业,不妨试一试看板软件。一、任务的可视化与精准分配新年......
  • wx.stopLocationUpdate
    wx.stopLocationUpdate(Objectobject)基础库2.8.0开始支持,低版本需做兼容处理。以Promise风格调用:支持小程序插件:支持,需要小程序基础库版本不低于2.8.0微信鸿蒙OS版:支持功能描述关闭监听实时位置变化,前后台都停止消息接收参数Objectobject属性类型默......
  • wx.startLocationUpdateBackground
    wx.startLocationUpdateBackground(Objectobject)基础库2.8.0开始支持,低版本需做兼容处理。以Promise风格调用:支持用户授权:需要scope.userLocationBackground小程序插件:不支持微信鸿蒙OS版:支持相关文档:地理位置接口新增与相关流程调整功能描述开启小程......
  • MySQL表的增删查改(下)——Update(更新),Delete(删除)
    文章目录Update将孙悟空同学的数学成绩修改为80分将曹孟德同学的数学成绩变更为60分,语文成绩变更为70分将总成绩倒数前三的3位同学的数学成绩加上30分将所有同学的语文成绩更新为原来的2倍Delete删除数据删除孙悟空同学的考试成绩删除整张表数据截断表插入......
  • GeneralUpdate应用程序自动升级跨平台解决方案,支持国产操作系统。
    背景:前些年随着技术的发展逐渐兴起“一次编码到处运行”、“国产化”的概念那么跨平台就是各大技术争相主推的能力之一。具备跨平台的能力同时也需要自动升级的能力,GeneralUpdate随之应运而生。介绍:1.GeneralUpdate是什么?GeneralUpdate 是一款基于.NET Standard2.0MIT......