返回顶部
首页 > 资讯 > 数据库 >MySQL几种更新操作的案例分析
  • 696
分享到

MySQL几种更新操作的案例分析

2024-04-02 19:04:59 696人浏览 独家记忆
摘要

目录案例分析更新账户金额直接更新乐观锁方案无锁方案排队操作常见问题如果数据中存在 update_time 字段受影响的行数是多少?如果执行 update 更新但受影响的行数

本文将通过一个 用户账户金额更新的案例 分析几种数据更新的操作的优劣。希望对大家有帮助 🐶。

数据库版本 : Mysql 5.7.23

案例分析

创建数据库的DDL:


CREATE TABLE `hw_account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `balance` int(11) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

更新账户金额

直接更新

方案 1 查询后更新


# 数据查询
select * from hw_account where id = 1;

# 数据更新
update hw_account set balance = 5 where id = 1;

存在的问题,就是分两次操作,如果并发执行的时候,可能造成更新丢失的问题.

乐观锁方案

利用版本号操作,即对数据库增加乐观锁的方式进行。


# 数据查询
select * from hw_account where id = 1;

# 数据更新
update hw_account set balance = 5 , version = version + 1 
  where id = 1 and version = n;
  
# 判断是否成功  
if row < 1 {
   回滚
}

存在的问题,如果该条数据并发操作的时候,会导致其他的请求失败。如果这个请求的前置链路比较长的话, 回滚成本比较高。

无锁方案

不用查询,采用数据库的计算,也不需要版本号的操作,直接通过域值进行有效性判断。具体的 sql 如下:


# 数据更新
update hw_account set balance = balance + @change_num , version = version + 1 
  where id = 1 and version = n;
  
# 判断是否成功  
if row < 1 {
   回滚
}   

这种方案修改比较简单, 但是依赖于数据计算,感觉不是特别友好。

排队操作

通过 Redis 或者 zk 的分布式锁,进行数据请求进行排队。然后在进行数据更新。


# 伪代码

if (获取分布式锁) {
  update hw_account set balance = @balance where id = 1;
} else {
  # 进入等待,或者进行自旋获取锁
}

常见问题

如果数据中存在 update_time 字段受影响的行数是多少?

update_time 的字段定义如下,如果数据为id = 1, status = 1 如果执行更新数据的 sql 为


update hw_account set `status` = 1 where id = 1;

返回的受影响的行数为 0;

如果执行 update 更新但受影响的行数为 0 会加行锁吗?

会的, 执行更新的语句都会加行锁(前提,事务内)

参考资料

mysql.com

到此这篇关于MySQL几种更新操作的案例分析的文章就介绍到这了,更多相关MySQL 更新操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL几种更新操作的案例分析

本文链接: https://lsjlt.com/news/155508.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL几种更新操作的案例分析
    目录案例分析更新账户金额直接更新乐观锁方案无锁方案排队操作常见问题如果数据中存在 update_time 字段受影响的行数是多少?如果执行 update 更新但受影响的行数...
    99+
    2024-04-02
  • redis之List操作的案例分析
    小编给大家分享一下redis之List操作的案例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!List操作,redis中的L...
    99+
    2024-04-02
  • MySQL更新,删除操作分享
    目录一、更新二、删除一、更新 UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2,... WHERE 条件; 把id为12所对应的名字改为老哈: upd...
    99+
    2024-04-02
  • Mysql 如何分组查询取最新的几种方案
    1.row_number函数 (mysql8以上支持) 示例: SELECT * FROM ( SELECT *, row_number ( ) over ( PARTITION ...
    99+
    2023-08-31
    mysql 数据库 sql
  • Mysql中join操作的示例分析
    小编给大家分享一下Mysql中join操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!join的类型1.  ...
    99+
    2024-04-02
  • mysql权限操作的示例分析
    这篇文章给大家分享的是有关mysql权限操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 1、创建新用户: create user mark@localhost ...
    99+
    2024-04-02
  • Vue数据更新视图不更新的几种解决方案小结
    目录Vue数据更新视图不更新的几种解决知识拓展对象属性的添加或删除异步更新队列Object.assign方法vue多层循环Vue更改了数据但是视图却没有更新Vue数据更新视图不更新的...
    99+
    2022-11-13
    Vue数据更新 Vue视图不更新 Vue数据
  • JavaScript中数组各种操作的示例分析
    这篇文章主要介绍JavaScript中数组各种操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!声明一个数组原来是如下声明:var s = new Array();但是 现...
    99+
    2024-04-02
  • mysql中in操作符的示例分析
    这篇文章给大家分享的是有关mysql中in操作符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在之前学习其他模块的时候,我们接触到了in操作符,不过在mysql数据库中很多人就不知道怎么运用了。我们今天...
    99+
    2023-06-14
  • mysql中数据操作的示例分析
    这篇文章给大家分享的是有关mysql中数据操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、读取数据select * from tb1;select...
    99+
    2023-06-15
  • ​MySQL Router的案例分析
    这篇文章主要介绍了MySQL Router的案例分析,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。MySQL Router用于取代MySQL P...
    99+
    2024-04-02
  • Postgres-XL更新的示例分析
    本篇文章为大家展示了Postgres-XL更新的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。2018年10月25日2ndQuadrant发布了Postgr...
    99+
    2024-04-02
  • SpringBoot实现ORM操作MySQL的几种方法
    目录1.第一种方式:@Mapper2.第二种方式@MapperScan3.第三种方式:Mapper文件和Dao接口分开管理4.事务使用mybatis框架操作数据,在springboo...
    99+
    2024-04-02
  • MyBatis-Plus中更新操作的两种实现
    目录前言一、通过id更新二、条件更新2.1 使用QueryWrapper进行条件更新2.2 使用UpdateWrapper进行条件更新总结 前言 本文学习MP中的更新操作方...
    99+
    2023-05-15
    MyBatis-Plus 更新操作 MyBatis-Plus id更新 MyBatis-Plus条件更新
  • MySQL中DML语言操作的示例分析
    这篇文章主要介绍MySQL中DML语言操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!补充说明,外键:不要使用外键,一切外键概念都在应用层解决。补充说明,数据库的列,也就...
    99+
    2024-04-02
  • mysql中更新锁与排它锁的示例分析
    这篇文章将为大家详细讲解有关mysql中更新锁与排它锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一直没有认真了解UPDATE操作的锁,最近在MSDN...
    99+
    2024-04-02
  • mysql用户管理操作实例分析
    本文实例讲述了mysql用户管理操作。分享给大家供大家参考,具体如下: 本文内容: 用户的介绍 查看用户 创建用户帐户 修改账户 删除帐户 关于匿名用户 首发日期:2018-04-19 ...
    99+
    2022-05-15
    mysql 用户管理
  • Nessus更新到8.3.0的示例分析
    这篇文章给大家介绍Nessus更新到8.3.0的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Nessus更新到8.3.0更新内容包括:(1)专业版的报告功能更为灵活,允许用户选择包含的信息。(2)提升Ness...
    99+
    2023-06-05
  • MySQL数据库基本操作的示例分析
    这篇文章主要介绍了MySQL数据库基本操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、数据库的安装这个就不在这里过多阐述了,...
    99+
    2024-04-02
  • MySQL数据库常用操作的示例分析
    小编给大家分享一下MySQL数据库常用操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:一、查询不同表中同名...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作