mysql 锁

 

1. 根据加锁的范围

  锁大致可以分为,全局锁,表级锁,行级锁。

  1.1.全局读锁的 方法:

    命令 flush tables with read lock (FTWRL)

    当需要把整个库处于只读状态,可以使用这个命令,之后数据更新语句,数据定义语句,更新类事务提交 都会阻塞。

    如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆;

    如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。

  1.2 表级锁

    MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

  1.3 行锁

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

      1.在 innodb 事务中,行锁是在需要的时候加上去的,但并不是不需要了就立马释放掉,而是等事务结束后释放。这就是两阶段锁

        所以-如果一个事务需要锁多个行,要把最有可能造成锁冲突,最可能影响并发的锁尽量往后放。

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

        出现死锁后,两种策略:

          1.直接进入等待,到达超时时间可以通过 innodb_lock_wait_timeout 进行设置。 默认50S

          2.发起死锁检测,发现死锁后,主动回滚死锁中的某一事务,让其它事务继续执行。设置参数 innodb_deadlock_delect 为 on ,表示开启这个逻辑

 

      死锁检测 会额外的负担 造成cpu看着利用率很高 但是没有执行几个事务。

      解决方法:
        1.自确定,如果确保业务中不会出现死锁就关闭死锁检测。 存在风险
        2.控制并发度。
        建议在服务层做,如果有中间键 可以在中间件中实现。

 

mysql 锁

上一篇:vue获取dom元素注意问题


下一篇:android4.0实现一个简单的锁屏程序