Madao No More

你的努力程度之低,根本轮不到拼天赋.


  • 首页

  • 底层基础

  • 人文书籍

  • 日记

  • 面试问题

  • Linux

  • 编程语言

  • 服务器应用

  • 各种工具软件

  • 工作中的问题

  • 归档

  • 关于

  • 搜索
close

6_行锁

时间: 2019-08-22   |   分类: 服务器应用     |   阅读: 656 字 ~2分钟
  • 1. 要点
  • 2. 两阶段锁
    • 2.1. 影响
      • 2.1.1. 例子
  • 3. 死锁
    • 3.1. 死锁解决方案
    • 3.2. 热点数据更新
  • 4. 问题

1. 要点

  • 行锁由各个引擎自己实现.
    • 如果引擎不支持,则只能使用表锁.

2. 两阶段锁

6_行锁

当事务A提交后,事务B才能执行.

  • InnoDB中,行锁时需要时才加上
  • 直到事务结束才释放.

2.1. 影响

如果事务这种需要锁多个行,要把最可能造成冲突的锁尽量往后放.

2.1.1. 例子

一个事务:

  1. 用户扣钱
  2. 商户加钱=====>这个时最有可能造成冲突的.
  3. 记录交易日志

优化:把2放到最后,(延迟加锁时机)

  1. 用户扣钱
  2. 记录交易日志
  3. 商户加钱=====>这个时最有可能造成冲突的.

3. 死锁

并发中不同线程出现循环的资源依赖,互相等待别的线程释放资源.

死锁

3.1. 死锁解决方案

  • 进入等待,直到超时.innodb_lock_wait_timeout=默认是50
    • 如果时间过短,可能会出现加上锁,正在起作用时,超时去掉了.
  • 死锁检测:发现死锁后,主动回滚其中一个事务,让其他事务执行innodb_deadlock_detect=on
    • 优先推荐使用死锁检测.

3.2. 热点数据更新

如果出现热点数据更新,每个线程都需要检测自己的加入是否造成死锁.导致效率低下

解决:

  • 业务上保证不出现死锁.
  • 控制并发量.
  • 业务上处理:把一个热点数据拆分.比如,商户可以有10个账户.更新时随机选择一个.

4. 问题

如何正确的删除表里的前10000行数据?

  1. 直接执行delete from t limit 10000;
    1. 一次锁住10000行,执行时间长,大事务可能造成主从延迟
  2. 在一个链接中循环20次delete from t limit 500;
    1. 这个这种.
  3. 在20个链接中执行delete from t limit 500;
    1. 这是20个并发.会造成第2到20的链接被阻塞.
#服务器应用 - MySQL书籍 - 极客时间_丁奇的MySQL基础课#
5_全局锁和表锁
7_事务和锁
Madao

Madao

人的一切痛苦,本质上都是对自己无能的愤怒.

505 日志
8 分类
78 标签
GitHub E-mail
© 2009 - 2022 Madao No More
Powered by - Hugo v0.89.4
Theme by - NexT
0%