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所认证的安全散列算法.能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的 ...