热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql优化死锁_Mysql优化记录(二)死锁

死锁1:问题来由服务端错误日志:{Source:varlibjenkinstoolsorg.jenkinsci.plugins.golang.GolangInstal

死锁1:

问题来由

服务端错误日志:

{Source:/var/lib/jenkins/tools/org.jenkinsci.plugins.golang.GolangInstallation/go/src/git.jiayougougou.com/snail/server/models/user_shop.go:162

Time:2018-08-0215:41:53.742066909 +0800 CST Level:log UseTime: Sql:

Message:Error 1213: Deadlock found when trying to get lock; try restarting

transaction}

代码定位

func (u UserShop) SetUserDefaultShop(userId, shopId int) error {

if err := u.DB().Table(u.TableName()).Where("user_id = ? and shop_id = ?", userId, shopId).Update("is_default", SureYes).Error; err != nil {

return err

}

//设置其他店铺未不默认

if err := u.DB().Table(u.TableName()).Where("user_id = ? and shop_id != ?", userId, shopId).Update("is_default", SureNo).Error; err != nil {

return err

}

if err := u.clear(userId); err != nil {

return err

}

return nil

}

部分表结构

CREATE TABLE user_shop (

user_shop_id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键自增',

user_id int(11) NOT NULL COMMENT '用户Id',

shop_id int(11) unsigned NOT NULL COMMENT '店铺id',

type tinyint(4) NOT NULL DEFAULT '1' COMMENT '1: 管理员;2:普通员工',

is_default tinyint(1) NOT NULL DEFAULT '1',

home_set varchar(255) NOT NULL DEFAULT '' COMMENT '店铺设置',

PRIMARY KEY (user_shop_id),

UNIQUE KEY user_id (user_id,shop_id) USING BTREE,

KEY shop_id (shop_id) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=12800 DEFAULT CHARSET=utf8mb4 COMMENT='用户与商品的关联表'

问题解决思路

首先通过业务代码怀疑进行update时,又进行了select,但是出现了事务中的资源抢夺导致死锁

怀疑代码的索引未生效导致了锁表,因为sql语句中用了!

事务的本质进行分析

验证1 资源抢夺

通过goroutine进行了并发执行

func TestRR(t *testing.T) {

Init()

ch := make(chan error)

go func() {

for {

err := UserShopDefault.SetUserDefaultShop(4, 2)

if err != nil {

ch

}

fmt.Println(11)

}

}()

go func() {

for {

err := UserShopDefault.SetUserDefaultShop(4, 2)

if err != nil {

ch

}

//fmt.Println(11)

//_, err := UserShopDefault.GetByUserIdAndShopId(4, 2)

//if err != nil {

//ch

//}

fmt.Println(22)

}

}()

fmt.Println(

}

结果并未退出并打印错误,一直保持正常运行。因此排除第一种可能

验证2,索引未生效导致行锁

其实第一个代码已经证明了没有行锁,但是还是不放心进行了explain分析。

explain select *From user_shop where shop_id != 2 and user_id = 4;

expalin update ...

结果也是,索引能够正常生效,就算是!。另外update和delect的explain要mysql5.7版本后才支持。

验证3,事务的隔离性分析

查看mysql的隔离性

select @@tx_isolation

reapeat read

是默认的RR(保障主从备份)

验证4,其他



推荐阅读
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
晨心晨艺日记
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有