行锁
1. mysql的行锁是在引擎层由各个引擎自己实现的,但并不是所有的引擎都支持行锁,比如MyISAM就不支持行锁
2. 行锁就是针对数据表中行记录的锁,举个例子:如果事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能更新
其他概念
两阶段锁协议
在InnoDB事务中,行锁是在需要的时候被加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放
由两阶段锁协议所导出的业务原则:
-
如果你的事务需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁往后放
图解例子:
问题 :
- 如果出现并发访问数过高(很多的人买电影票),自己的服务器CPU消耗接近100/100,但整个数据库每秒钟就执行不到100个事务,这是什么原因呢 ?
死锁
当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁
出现死锁后,有两种策略:
- 直接进入等待直到超时
等待超时时间可通过innodb_lock_wait_timeout参数控制
mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+
- 发起死锁检测,发现死锁后主动回滚死锁链条上的事务
将参数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