美文网首页JAVA进阶
mysql之锁(全局&表&行)

mysql之锁(全局&表&行)

作者: 每天进步一点点变成更好的自己 | 来源:发表于2022-04-14 12:34 被阅读0次

    根据加锁的范围,MYSQL里面的锁大致分为全局锁、表级锁、行锁。

    全局锁:对整个数据库实例加锁。命令:Flush tables with read lock (FTWRL)
    表级锁:一种是表锁,一种是元数据锁(meta data lock,MDL)。
    行锁:

    1、全局锁

    全局锁命令:Flush tables with read lock (FTWRL)
    应用场景: 做全库逻辑备份。
    single-transaction 方法只适用于所有的表使用事务引擎的库。

    2、表级锁

    表锁语法:lock tables … read/write,比如lock tables t1 read, t2 write;
    释放锁:unlock tables
    应用场景:一般在数据库引擎不支持行锁的时候会被用到。
    在 alter table 语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到 MDL 写锁最好,拿不到也不要阻塞后面的业务语句,先放弃:
    ALTER TABLE tbl_name NOWAIT add column ...
    ALTER TABLE tbl_name WAIT N add column ...

    3、行锁

    行锁:在引擎层由各个引擎自己实现的。行锁针对数据表中行记录的锁。
    两阶段锁协议:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。
    死锁:在并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态。
    死锁检测:发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect = on,表示开启这个逻辑。

    相关文章

      网友评论

        本文标题:mysql之锁(全局&表&行)

        本文链接:https://www.haomeiwen.com/subject/kcousrtx.html