数据库锁之行锁(Mysql45讲)

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。数据库锁之行锁(Mysql45讲),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

行锁

1. mysql的行锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁,比如MyISAM就不支持行锁
2. 行锁就是针对数据表中行记录的锁,举个例子:如果事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能更新

其他概念

两阶段锁协议

在InnoDB事务中,行锁是在需要的时候被加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放

由两阶段锁协议所导出的业务原则:

  • 如果你的事务需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁往后放
    图解例子:
    在这里插入图片描述问题 :

    • 如果出现并发访问数过高(很多的人买电影票),自己的服务器CPU消耗接近100/100,但整个数据库每秒钟就执行不到100个事务,这是什么原因呢 ?

死锁

当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁

出现死锁后,有两种策略:

  1. 直接进入等待直到超时
    等待超时时间可通过innodb_lock_wait_timeout参数控制
mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+
  1. 发起死锁检测,发现死锁后主动回滚死锁链条上的事务
    将参数innodb_deadlock_detect设置为on
mysql> show variables like 'innodb_deadlock_detect';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_deadlock_detect | ON    |
+------------------------+-------+
  • 如果有一千个并发线程,死锁检测可能要一百万次判断,所以开启死锁检测的话也得考虑是否消耗的太多的资源

解决死锁检测消耗太多资源的方案

1. 把死锁检测关掉,可关掉死锁后可能会出现大量的超时操作
2. 控制并发度,把1000个并发线程控制在10个以内就很爽(并发控制最好做在服务端)
3. 把一行改成逻辑上的多行来避免锁冲突

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202556.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!