数据库版本 : 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;
# 数据查询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 hw_account set `status` = 1 where id = 1;

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

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

参考资料

mysql.com

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

更多相关文章

  1. Android(安卓)后台线程调用前台线程的几种方法
  2. 我今天的面试题,注册广播有几种方式,这些方式有何优缺点?请谈谈Andr
  3. Android(安卓)代码设置Color的几种方式
  4. JS判断终端类型的几种方法
  5. 查看基于Android(安卓)系统单个进程内存、CPU使用情况的几种方法
  6. Android中的几种网络请求方式详解
  7. Android实现页面跳转的几种方式(转贴)
  8. Android高手进阶教程(二十二)之---Android中几种图像特效处理的
  9. Android中的几种网络请求方式详解

随机推荐

  1. 冒泡排序算法代码是什么?
  2. C语言属于什么语言
  3. C语言输入两个数如何输出最大的数?
  4. c++中判断重载方法的依据是什么
  5. C语言中在main函数中定义的变量是全局变
  6. exit(0)在c语言中是什么意思
  7. const用法是什么?
  8. C语言中输出字符串用什么符号
  9. c语言输入五个数如何求平均值?
  10. c语言根号函数是什么