面试官:能说说你对隔离级别的理解吗?
我:在并发环境下,数据或记录可能同时被多个事务读写,那么这就有可能造成当前事务被其他事务干扰的情况,比如我们所说的虚读,不可重复读,幻读。而数据库要求实现隔离性,也就是各个事务之间是不能被互相干扰的,所以,就提出了一些隔离各个事务的方法。
我:为了避免这种并发问题,在mysql内部通过加锁的方式实现好了解决方案可供选择,就是配置事务隔离级别。当然,避免事务并发问题是需要付出性能代价的,此时和分布式系统设计一样(CAP定理及BASE理论),为了保证一致性就一定会牺牲性能,要做取舍。
我:mysql提供了四种隔离级别,分别是
读未提交(read-uncommitted),不可重复读(read-committed)
可重复读(repeatable-read),串行化(serializable)
不同的隔离级别可以解决不同的问题,隔离级别越低,事务请求的锁越少,相应性能也就越高,如没有特殊要求或有错误发生,使用默认的隔离级别即可,如果系统中有高频读写并且对一致性要求高那么就需要比较高的事务隔离级别甚至串行化。
所以隔离级别的本质就是提供mysql的隔离性,并且提供好的数据一致性。
面试官:靠缓存可以提升高事务隔离级别的性能吗?
我:提升事务隔离级别的目的本质是提供更高的数据一致性,如果前置有缓存,那么缓存只能提供高效读并不能保证数据及时一致性,相反的我们还需要对缓存管理有额外的开销。