专栏首页程序员开发者社区怎么减少行锁对性能的影响

怎么减少行锁对性能的影响

怎么减少行锁对性能的影响

MySQL 的行锁是引擎层由引擎实现的,并不是所有的引擎都支持行锁,比如 MyISAM 引擎不支持行锁。

MyISAM 引擎特点

MySQL 5.7 MyISAM存储引擎的版本特性:

MyISAM

InnoDB 存储引擎

MySQL 5.7 InnoDB存储引擎的版本特性:

InnoDB

行锁针对的是数据表中的行记录的锁,比如事务 A 更新一行,这时候事务B 也要更新一行,则必须等事务 A 的操作完成后才能进行更新。

事务A

事务B

begin; updatate t set k=k+1 where id =1;update t set k=k+1 where id= 1

begin; update t set k = k+2 where id =1;

commit;

事务A 持有两个记录的行锁,在 commit 的时候释放,在 InnoDB 事务中,行锁 是在需要的时候才加上,而是要等待事务结束时才释放。

如果服务器 CPU 消耗接近 100% ,但整个数据库每秒执行不到100个事务,那很有可能就出现死锁了。

死锁和死锁检测

死锁的4个必要条件

  • 互斥条件
  • 请求保持条件
  • 循环等待
  • 不可剥夺

事务A

事务B

begin;update t set k=k+1 where id =1;

begin;

update t set k=k+1 where id=2;

update t set k=k+1 where id =2;

update t set k=k+1 where id =1;

事务 A 在等待事务 B 释放 id =2 ,在事务 B 在等待事务 A 释放 id =1的行锁。事务A 事务B循环等待资源释放,满足循环等待,互斥,不可剥夺,请求保持等条件。

如何解决数据库死锁?

有两种策略可解决死锁:

  • 一种策略,是直接进入等待,知道超时,超时时间可通过参数 innodb_lock_wait_timeout 来设置。
  • 发起死锁检测,主动回滚死锁联调中的某一个事务,其他事务继续执行。将参数 innodb_deadlock_detect 设置为 on 标识开启这个逻辑。

怎么解决热点更新导致的性能问题?

  • 死锁检测要耗费大量的 CPU 资源,如果确定业务一定不会出现死锁,可以临时把死锁检测关掉。
  • 另外一个是思路是控制并发度,如果并发能够给控制住,同一行同时最多有 10个线程在更新,那么死锁检测的成本很低。
欢迎关注公众号:程序员开发者者社区

布隆过滤器可以一定程度上解决缓存穿透的问题,解决缓存穿透的问题核心是减少数据库的并发访问。由于 hash 碰撞的原因,布隆过滤器存在一定的误判几率,也存在不支持删除元素的问题。

本文分享自微信公众号 - 程序员开发者社区(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 什么是事务隔离

    MySQL 中事务支持是在引擎实现的, MySQL 原生的 MyISAM 引擎不支持事务,这也是 MyISAM 被 InnoDB 引擎取代的重要原因。

    王小明_HIT
  • 如何利用事务消息实现分布式事务?

    一说起事务,容易联想到数据库。我们日常使用事务的场景,绝大部分都是在操作数据库的时候。像 MySQL、Oracle这些主流的关系型数据库,也都提供了完整的事务实...

    王小明_HIT
  • Spring 是如何保证一个事务内获取同一个Connection

    Spring有声明式事务和编程式事务,声明式事务只需要提供 @Transactional的注解。然后事务的开启、提交、回滚、资源的清理都由Spring 来管理,...

    王小明_HIT
  • MySQL 在并发场景下的问题及解决思路

    对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为...

    wangxl
  • JanusGraph -- 事务详解(janusgraph transactions)

    几乎所有与JanusGraph的交互都与事务相关联。JanusGraph事务对于多个线程并发使用是安全的。JanusGraph实例上的方法,如graph.V(....

    洋仔聊编程
  • 故障分析 | 有效解决 MySQL 行锁等待超时问题【建议收藏】

    上述这个错误,接触 MySQL 的同学或多或少应该都遇到过,专业一点来说,这个报错我们称之为锁等待超时。

    爱可生开源社区
  • mysqldump与innobackupex备份过程你知多少(二)

    1.2.3. 使用WITH CONSISTENT SNAPSHOT子句的作用 START TRANSACTION语句使用WITH CONSISTENT SNA...

    沃趣科技
  • [预训练语言模型专题] 百度出品ERNIE合集,问国产预训练语言模型哪家强

    ERNIE: Enhanced Representation through Knowledge Integration(2019)

    朴素人工智能
  • 试题 入门训练 Fibonacci数列

    Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

    韩旭051
  • Intel 再曝“幽灵”类漏洞:二四六代酷睿受影响

    在英特尔处理器的“熔断”(Meltdown)和“幽灵”(Spectre)漏洞风波还未完全平息的时候,研究人员又在英特尔的处理器上发现了新的漏洞,此前的“熔断”与...

    Debian社区

扫码关注云+社区

领取腾讯云代金券