mysql总结
mysql事务特性:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
并发访问数据库造成的问题:
- 脏读:读到了别的事务未提交的数据,当别的事务回滚后,那么读到的这个数据就是脏数据
- 不可重复读:在一个事务里,两次读取同一个数据集合,两次读到的数据不一致;主要发生在别的事务对读到的数据进行了更新操作,不可重复读重点在于数据的修改
- 幻读:幻读发生在范围读的时候,两次读的数据条数不一致;主要发生在别的事务对数据进行更新删除操作;简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
Mysql的四大隔离级别:
可重复读(Repeatable Read):确保同一事务的多次读取结果一致,但可能发生幻读。
串行化是最严格的隔离级别,但是并发时每次读和写都需要加锁,会导致性能差。
Mysql默认的隔离级别是RR 可重复读级别。但是通过MVCC机制解决了读-写的并发问题。
在MySql中,我们也要处理三种类型的并发关系:
- 读-读 并发; 这种情况下,不存在更新数据问题,只有读取数据,不存在并发问题。
- 读-写 并发: 有线程安全问题,可能导致脏读、不可重复读、幻读数据一致性读问题,必须由数据库提供的事务隔离机制来解决。
- 写-写 并发: 有线程安全问题,可能存在更新丢失问题,比如第一类更新丢失问题(A事务撤销时,把已经提交的B事务的更新数据覆盖了)、第二类更新丢失问题(A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失)。
在数据库并发场景中,解决并发问题,就需要加锁。只有读-读之间的操作才可以并发执行,读-写,写-读,写-写操作都要阻塞,这样就会导致 MySQL 的并发性能极差。
MySql提供了一种乐观锁的实现:MVCC(多版本并发控制),来解决读-写并发不加锁。
InnoDB引擎通过MVCC,解决了脏读、不可重复读,通过MVCC + Next-Key Lock(临键锁)来解决幻读,实现了事务的隔离级别Repeatable Read(可重复读)。
但是可重复读隔离级别下,写-写并发问题只能靠开发者显示或隐式使用锁来自行解决。
MVCC是如何解决幻读的
https://blog.csdn.net/m0_73648729/article/details/144279025