gorm 实现 mysql for update 排他锁
关于 MySQL 的排他锁网上已经有很多资料进行了介绍,这里主要是记录一下 gorm 如果使用排他锁。
排他锁是需要对索引进行锁操作,同时需要在事务中才能生效.具体操作如下:
假设有如下数据库表结构:
CREATE TABLE `employees` (
    `id` int(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
    `name` varchar(64) NOT NULL COMMENT '雇员姓名',
    `age` TINYINT(5) NOT NULL COMMENT '雇员年龄',
    `addr` varchar(64) NOT NULL COMMENT '雇员家庭地址',
     PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='雇员信息表';
执行代码如下:
// Employee ...
type Employee struct {
	Name string `gorm:"column:name"`
	Age  int    `gorm:"column:age"`
	Addr string `gorm:"column:addr"`
}
// ForUpdateLock ...
func ForUpdateLock(db *gorm.DB, id int) error {
	// 创建事务
	tx := db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()
	var employee Employee
	if err := tx.Set("gorm:query_option", "FOR UPDATE").First(&employee, id).Error; err != nil {
		tx.Rollback()
		return err
	}
	// 此时指定 id 的记录被锁住.如果表中无符合记录的数据,则排他锁不生效
	// 执行其他数据库操作
	// ...
	if err := tx.Commit().Error; err != nil {
		tx.Rollback()
		return err
	}
	return nil
}
这里使用的主键索引来创建排他锁,也可以使用普通索引进行排他锁操作。
参考
gorm 实现 mysql for update 排他锁的更多相关文章
- 数据库:Mysql中“select ... for update”排他锁分析
		Mysql InnoDB 排他锁 用法: select … for update; 例如:select * from goods where id = 1 for update; 排他锁的申请前提:没 ... 
- Mysql中“select ... for update”排他锁(转)
		原帖地址 https://blog.csdn.net/claram/article/details/54023216 Mysql InnoDB 排他锁 用法: select … for update; ... 
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
		浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ... 
- mysql共享锁与排他锁
		mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能 ... 
- Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
		一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ... 
- Mysql共享锁、排他锁、悲观锁、乐观锁
		一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--间隙锁( ... 
- for update排他锁详解
		使用场景: 高并发并且对于数据的准确性很有要求. 落实到mysql就是在事务中使用,只有使用InnoDB时才用,在begin于commit之间使用(只有此引擎支持事务). 本质: 给表或行上个锁以便接 ... 
- mysql(for update)悲观锁总结与实践
		悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制( ... 
- Mysql存储引擎以及锁机制
		一.常用命令 1.查看引擎(默认为InnoDB) 查看mysql提供的存储引擎:show engienes 查看mysql当前默认的存储引擎:show variables like '%storage ... 
随机推荐
- fio 文件系统io 性能测试安装使用
			备注: 使用的是yum 进行的安装,大家可以使用源码编译安装(centos 7) 安装 yum install -y fio 命令行参数 fio-2.2.8 fio [options] [job op ... 
- 7kyu kata
			https://www.codewars.com/kata/isograms/train/java CW 大神 solution: public class isogram { public stat ... 
- mysql rtrim() 函数
			mysql> select rtrim(" cdcdcd "); +--------------------+ | rtrim(" cdcdcd ") | ... 
- es6学习2:变量的解构赋值
			一:数组的解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar ba ... 
- /usr/bin/xauth: file /home/user/.Xauthority does not exist
			错误信息如下: /usr/bin/xauth: file /home/user/.Xauthority does not exist 错误原因:是因为添加用户时没有授权对应的目录,仅仅执行了usera ... 
- Res-DenseNetSegmentation模型调试记录
			参考:https://blog.csdn.net/AbstractSky/article/details/76769202 https://blog.csdn.net/jsliuqun/article ... 
- 第07组 Beta冲刺(3/5)
			队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:代码编辑器,目前没什么进展 展示GitHub当日代码/文档签入记录:(组内共用,已询问 ... 
- Deep High-Resolution Representation Learning for Human Pose Estimation
			Deep High-Resolution Representation Learning for Human Pose Estimation 2019-08-30 22:05:59 Paper: CV ... 
- python list 和 tuple详解
			list------------------------------------------------------------------------ Python内置的一种数据类型是列表:list ... 
- android -------- SHA 加密算法
			安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法.能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的 ... 
