JAVA进阶

mysql之锁(全局&表&行)

2022-04-14  本文已影响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,表示开启这个逻辑。

上一篇下一篇

猜你喜欢

热点阅读