五金网站方案,南京做网站牛,郑州网站制作计划,建立网站ftp锁#xff1a; mysql的锁分为全局锁、表锁、行锁、间隙锁
全局锁#xff1a;Flush tables with read lock 可以全局设计库为只读
表锁#xff1a;一种是表锁#xff0c;一种是元数据锁#xff08;meta data lock#xff0c;MDL#xff09;
lock tables t1 read,t2 wi…锁 mysql的锁分为全局锁、表锁、行锁、间隙锁
全局锁Flush tables with read lock 可以全局设计库为只读
表锁一种是表锁一种是元数据锁meta data lockMDL
lock tables t1 read,t2 wirte; 进行表锁
修改元数据时进行MDL
读锁之间不互斥因此可以有多个线程同时对一张表增删改查 读写锁之间、写锁之间是互斥的用来保证变更表结构操作的安全性。因此如果有两个线程要同时给一个表加字段其中一个要等另一个执行完才能开始执行
行锁 是Innodb引擎才有的MyISAM没有
间隙锁Gap Lock锁加在不存在的空闲空间可以是两个索引记录之间也可能是第一个索引记录之前或最后一个索引之后的空间。
间隙锁和行锁合称next-key lock每个next-key lock是前开后闭区间 原则1加锁的基本单位是next-key locknext-key lock是前开后闭区间 原则2查找过程中访问到的对象才会加锁 优化1索引上的等值查询给唯一索引加锁的时候next-key lock退化为行锁 优化2索引上的等值查询向右遍历时且最后一个值不满足等值条件的时候next-key lock退化为间隙锁 一个bug唯一索引上的范围查询会访问到不满足条件的第一个值为止
在进行select… for update/inser/ update语句的时候都会加上排他锁的next-key lock
在进行select… lock in share时 加共享锁。
参考 https://blog.csdn.net/qq_40378034/article/details/90904573 事物 MVCC(Multi-Version Concurrent Control基于多版本的并发控制)
MyISAM就不支持事务而InnoDB是支持事务的。
脏读即读取到别的事务未提交的数据 不可重复读即某个事务前后多次读取数据内容不一致。 幻读即某个事务前后多次读取读到的数据总量不一致。
事物隔离级别 读未提交Read Uncommitted: 支持脏读每次读取最新数据。 读已提交Read Committed 支持不可重复读不支持脏读。读取当前最新的已经提交的事物数据每次事物创建的时候都更新ReadView 可重复读Repeatable Read 不支持脏读和不可重复读。读取当前最新的已经提交的事物数据第一次事物创建的时候更新ReadView 串行化Serializable 全都不支持
Undo logysql在执行sql语句时会将一条逻辑相反的日志保存到undo log中。undo log中记录的也是逻辑日志。主要用于事务回滚时恢复原来的数据。
在数据库中的每一行上除了存放真实的数据以外还存在着3个隐藏列——row_id、trx_id与roll_pointer。 其中roll_pointer会记录上一个版本Undo log 的地址形成版本链
ReadView一致性快照在创建事物的时候会创建。
快照读简单的select查询即不包括 select … lock in share mode, select … for update可能会读到数据的历史版本。
当前读以下语句都是当前读总是读取最新版本会对读取的最新版本加锁
m_ids 在创建ReadView的那一刻mysql中所有未提交的事务id集合。 min_trx_id max_trx_id creator_trx_id即创建此ReadView的事务id
当undo log中的trx_id存在于ReadView中的时候说明事物没有提交。
在Read CommittedRC级别下当前事务总是希望读取到别的事务已经提交的数据因此当前事务事务会在执行每一次快照读的情况下都会去生成ReadView实时更新m_ids及时发现那些已经提交的事务。
在Repeatable ReadRR级别下当前事务当然也能够读取到别的事务已经提交的数据但为了避免不可重复读因此只会在执行第一次快照读的情况下去生成ReadView之后的快照读会一直沿用该ReadView。
参考https://blog.csdn.net/qq_33591903/article/details/120927753