备份数据库,全局锁
如果全部使用InnoDB引擎,那么直接 mysqldump -single-transaction 即可
否则用FTWRL语句,即 flush table with read lock。
你发现你的应用程序里有 lock tables 这样的语句
表锁一般是在数据库引擎不支持行锁的时候才会被用到的。
要么是你的系统现在还在用 MyISAM 这类不支持事务的引擎,那要安排升级换引擎
要么是你的引擎升级了,但是代码还没升级。我见过这样的情况,最后业务开发就是把 lock tables 和 unlock tables 改成 begin 和 commit,问题就解决了。
select for update
表示当前读。RR事务普通select查询只会查询最早的view,此时其他事务的update不会被读到
但是select for update则会把更新的update也读到,读取的是当前的数据,而不是RR事务的view数据。
Next-key lock
幻读会导致语义被破坏和数据一致性被破坏两个问题。
为了解决幻读,InnoDB引入了间隙锁(Gap Lock)。间隙锁,锁的就是两个值之间的空隙。比如表中有 6 个记录,就会有 7 个间隙。
间隙锁只会和insert操作产生冲突,其他都不会。
间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间。
缺点:可能会导致同样的语句锁住更大的范围,这