| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL(十)—线上MySQL锁超时了怎么办?update操作怎么上了个表锁啊? -> 正文阅读 |
|
[大数据]MySQL(十)—线上MySQL锁超时了怎么办?update操作怎么上了个表锁啊? |
一、异常错误先上一个出现异常的截图 二、尽量还原这个错误因为涉及到项目中的sql还需要讲业务,所以选择重新建一个简单的表,然后还原下这个错误 1.准备数据软件环境:MySQL5.7
数据如下 2.阐述业务以姓名name和年龄age修改分数score,很简单的一个sql语句
但是别看这么简单的sql语句,在线上就足以引发超时了。 测试锁超时
在navicat上测试,session2会出现锁超时现象 3.分析原因当执行update操作时,会给当前的数据加锁。InnoDB提供了行锁的机制,相对于myisam的表锁,锁的粒度降低,提供了并发的能力。但是如果使用不当也会出现表锁的现象 为什么呢? 再把上面session1的sql语句拿出来
又因为上面的例子session1是一个长事务,长时间占用锁不释放,所以session2根据条件where name=‘小3’ and age=1更新时只能去等待锁,直到session1事务提交事务锁,session2才会执行。 然而事务等待是有超时时间的,所以就出现了锁超时现象。 三、线上如何解决这个异常呢?1.设置锁超时时间将锁等待的时间稍微再延长一点,但是治标不治本
2.使用online ddl方式建立唯一索引我们知道在线上直接执行Alter table add key 操作会发生锁表操作,具体原理如下。参考文章
因此,MySQL 5.6 增加了 Online DDL,允许在不中断数据库服务的情况下进行 DDL 操作。 执行如下语句
所以这种办法在事务并发量小的情况下可以直接执行 3.动态增加服务节点写到这里可能有读者问了,你的update语句不能根据id进行更新吗,它就是一个唯一索引。是的!你想的完全没有问题,出现上面的原因是因为特殊业务场景没有返回前端id,所以直接用的其他字段标识了一行记录。 如果上面的online ddl还解决不了问题的话,只能去增加一个节点,修改nginx配置,使用nginx热更新机制新的节点,根据id更改的代码的节点动态添加到集群中。 可以参考这篇博客:https://blog.csdn.net/weixin_39805802/article/details/105982482https://blog.csdn.net/weixin_39805802/article/details/105982482 主要是用的nginx reload命令 如果使用k8s加docker的话,可能更容易实现一些。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:09:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |