做个平台网站怎么做的,网站看不到排版怎么办,网站设计 侵权,辉县市建设局网站根据加锁的范围#xff0c;MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类
全局锁
使用FTWRL命令 该锁让整个库处于只读状态的时候#xff0c;可以使用这个命令#xff0c;之后数据库的更新事务会被阻塞 使用场景#xff1a;全库逻辑备份 FTWRL与readOnly的区别 如果…根据加锁的范围MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类
全局锁
使用FTWRL命令 该锁让整个库处于只读状态的时候可以使用这个命令之后数据库的更新事务会被阻塞 使用场景全库逻辑备份 FTWRL与readOnly的区别 如果执行FTWRL命令之后由于客户端发生异常断开那么MySQL会自动释放这个全局锁整个库回到可以正常更新的状态。而将整个库设置为readonly之后如果客户端发生异常则数据库就会一直保持readonly状态这样会导致整个库长时间处于不可写状态风险较高。
表级锁
MySQL里面表级别的锁有两种一种是表锁一种是元数据锁
表锁
表锁的语法是 lock tables …read/write。可以用unlock tables主动释放锁也可以在客户端断开的时候自动释放。需要注意lock tables语法除了会限制别的线程的读写外也限定了本线程接下来的操作对象。
元数据锁
另一类表级的锁是MDLmetadata lock)。MDL不需要显式使用在访问一个表的时候会被 自动加上。MDL的作用是保证读写的正确性。你可以想象一下如果一个查询正在遍历一个 表中的数据而执行期间另一个线程对这个表结构做变更删了一列那么查询线程拿到的结果 跟表结构对不上肯定是不行的。 当对一个表做增删改查操作的时候加MDL读锁当要对表做结构变更操作的时候加MDL写锁
读锁之间不互斥因此你可以有多个线程同时对一张表增删改查。 读写锁之间、写锁之间是互斥的用来保证变更表结构操作的安全性。 如何正确使用MDL写锁 在alter table语句里面设定等待时间如果在这个指定的等待时间里面能够拿到MDL写锁最好拿不到也不要阻塞后 面的业务语句先放弃
行锁
行锁就是针对数据表中行记录的锁 在InnoDB事务中行锁是在需要的时候才加上的但并不是不需要了就立刻释放而是要等到事务结束时才释放(一个事务可能会执行多条SQL语句)。
死锁和死锁检测
死锁时有两个策略 一种策略是直接进入等待直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置。 另一种策略是发起死锁检测发现死锁后主动回滚死锁链条中的某一个事务让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on表示开启这个逻辑。 **怎么解决由这种热点行更新导致的性能问题呢**问题的症结在于死锁检测要耗费大量的CPU资源。 1.如果你能确保这个业务一定不会出现死锁可以临时把死锁检测关掉。但是这种操作本身带有一定的风险因为业务设计的时候一般不会把死锁当做一个严重错误毕竟出现死锁了就回滚然后通过业务重试一般就没问题了 2.控制并发度。根据上面的分析你会发现如果并发能够控制住比如同一行同时最多只有10个线程在更新那么死锁检测的成本很低就不会出现这个问题但是你会很快发现这个方法不太可行因为客户端很多。 3.考虑通过将一行改成逻辑上的多行来减少锁冲突,是以影院账户为例可以考虑放在多条记录上比如10个记录影院的账户总额等于这10个记录的值的总和。这样每次要给影院账户加金额的时候随机选其中一条记录来加。这样每次冲突概率变成原来的1/10可以减少锁等待个数也就减少了死锁检测的CPU消耗。 这个方案看上去是无损的但其实这类方案需要根据业务逻辑做详细设计。如果账户余额可能会减少比如退票逻辑那么这时候就需要考虑当一部分行记录变成0的时候代码要有特殊处理。 相关问题 如果你要删除一个表里面的前10000行数据有以下三种方法可以做到 第一种直接执行delete fromTlimit 10000; 第二种在一个连接中循环执行20次 delete fromTlimit 500; 第三种在20个连接中同时执行delete fromTlimit 500。 你会选择哪一种方法呢为什么呢