MySQL事务相关,隔离级别等

事务的特性

ACID
1、atomic 原子性
2、consistency 一致性
3、isolation 隔离性
4、durability 持久性

数据库隔离级别

1、读未提交 read uncommitted
2、读已提交 read committed
3、可重复读 read repeatable
4、序列化

不同隔离级别导致的问题

隔离级别 脏读 不可重复读 幻读
读未提交
读已提交 ×
可重复读 × ×
序列化 × × ×

脏读:没有提交的数据被读到了
不可重复读:针对修改删除操作来说,A刚刚读的数据被B改了,A再读的时候,就变了
幻读:针对插入操作,A刚刚统计总行数,B新增了一行,A再统计总行数就变了

可重复读的实现原理

MVCC多版本控制:

innodb存储引擎,会在每行数据的最后加两个隐藏列,一个保存行的创建时间,一个保存行的删除时间,但存放的不是时间,而是事务id,事务id是mysql自己维护的自增的全局唯一的
在一个事务内查询的时候,只会查询
1)创建时间的事务id小于等于当前事务id的行,这样可以确保这个行是当前事务中或者是之前事务创建的;
2)同时一个行的删除时间的事务id要么没有定义(没删除),要么是比当前事务id大(在事务开启之后删除的)
满足1和2的数据会被查出来

所以事务A中查询,事务B之后把数据删除,并不影响事务A对该数据的查询,因为删除的事务id > 当前事务id

对于修改
有一条数据 id=1 name = 张三
事务id = 100的 查询 结果是张三
事务id = 200 对该数据进行修改为 张四,实际上是插入了一条 id=1 name=张四 创建时间为200的数据

这时候事务id =100 再查询,还是张三

发布了347 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/104786369
今日推荐