MySQL事务隔离级别有哪些?分别解决了哪些问题?
共有四个隔离级别:
- 读未提交:
一个事务还没有提交的时候,它做的变更能被其他事务看到
-
读提交:
一个事务提交之后,它做的变更才能被其他事务看到 -
可重复读:
一个事务执行过程中看到的数据,和事务启动的时候看到的数据是一致的。 -
串行化:
会对记录加上读写锁,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成。
事务并发问题存在脏读,不可重复读,幻读这三种问题
脏读:
一个事务读取了另一个事务还没有提交的数据
不可重复读:
一个事务多次读取同一条记录,期间另一个事务修改了数据,导致前后读取的数据不一致
幻读:
多次执行一个查询,在此期间有事务修改了数据, 导致前后查询不一致
读未提交一个问题都没有解决
读已提交可以避免脏读问题
可重复读避免了脏读和不可重复读
串行化所有问题都可以解决,性能最差
串行化隔离级别是通过什么实现的?
所有SQL都会加行级锁,进行增删改查中的一个,其他操作都无法进行。没有MVCC机制(处理并发访问),读写操作也没办法并发
脏读和幻读的区别?
-
脏读是一个事务读到了另一个未提交事务修改过的数据,如果另外一个事务回滚了,刚才读到的数据就和数据库里面的数据不一样了
-
幻读是前后两次查询的结果集的数量是不同的,eg:如果我执行了两次select,但第二次返回了第一个没有返回的行数据
MySQL默认隔离级别是什么?如何实现的?
Mysql默认隔离级别是可重复读
一个事务执行过程中看到的数据和启动时看到的数据是一样的
select查询是通过**MVCC(多重)**实现的,在MVCC实现中,每条记录都会有一个版本号,启动时读取了哪个版本号,过程中会一直看开始时候的版本号,从而保证了事务的隔离级别。
可重复读隔离级别是在开启事务之后,执行一条select语句之后,生成一个Read View,后续事务查询数据都复用这个Read View,所以保证了事务期间多次读到的数据是一致的。