票务网站开发,特色软件app推荐,网站的验证码是怎么做的,建官网公司地址在MySQL的事务隔离锁机制中#xff0c;MVCC是一个非常重要的概念#xff0c;学会MVCC可以更好地理解MySQL如何实现各种隔离级别。
首先#xff0c;大概地介绍一下mysql的事务隔离级别#xff1a;
1、读未提交#xff08;Read Uncommited#xff09;#xff1a;指的是MVCC是一个非常重要的概念学会MVCC可以更好地理解MySQL如何实现各种隔离级别。
首先大概地介绍一下mysql的事务隔离级别
1、读未提交Read Uncommited指的是在一个事务中允许读取其他事务未提交的数据也就是脏数据。因此在这个隔离级别下存在“脏读”的问题。。
2、读未提交Read Commited在一个事务中只允许读取其他事务已经提交的数据但是在事务中前后两次可能读到不一样的数据因为可能在这期间其他事物对当前读的数据进行修改并且修改数据的事务已经提交了。所以在RC级别下存在“不可重复读”的问题。
3、可重复读Read Repeatable在同一个事务中在任意时刻读取到的同一条记录的数据是一样的但是并不能保证在这期间表内的数据不会变化可能在事务期间其他事务中插入了几条数据导致当前事务两次读取的数据记录数不一样。因此RR级别下存在“幻读”的问题。
4、序列化/串行化Serializable所有操作都加锁保数据在同一时刻只有一个事务在读取数据所以就不存在上面的问题了。这个隔离级别下保证了数据的一致性但是牺牲了读写的性能。 什么是MVCC
MVCCMuti Version Concurent Control多版本并发控制是MySQL中保证数据读写安全的一种机制。
MVCC中设计的概念
ReadViewtrx_id事务IDroll_pointer回滚指针 在四种隔离机制中只有RC和RR支持MVCC。
当开启一个事务时会创建一个ReadViewReadView中保存了当前活跃的事务ID将这些事务ID从小到大排序生成一个数组。
隐含字段在MySQL的聚簇索引中包含了两个隐含的字段trx_id、roll_pointer
当读取数据时获取数据的最大事务ID和ReadView中的事务ID进行比较
如果trx_id比ReadView中的所有事务ID都小说明是之前的事务已经提交的数据允许读取。如果trx_id在当前ReadView中说明事务还没有提交根据ReadView中最小的roll_pointer也就是上一个事务的ID去读取之前的数据。如果trx_id比当前ReadView中的事务ID都大说明数据是在当前事务开启之后新增的不允许读取。 RC每次创建事务时都会新创建一个ReadView所以可能读到的数据不一样。
RR每次创建事务时不会创建新的ReadView所以读到的数据一样。