一位有5年工作经验的粉丝去阿里面试,被问到一个关于数据库事务隔离级别的问题。当时没有问答,希望能给他一个参考答案。那么,今天我就来说说我的理解。另外,之前面试题分析的supportingdocument,我花了一个多星期准备。一共10W字。想要获得的可以在我的个人资料中找到。1、脏读、幻读和不可重复读在SQL操作中,多事务竞争可能会产生三种不同的现象,即脏读、幻读和不可重复读。先看脏读,如图,假设两个事务T1/T2同时执行,T1事务可能会读取到T2事务未提交的数据,但未提交的事务T2可能会回滚。这样就导致了T1事务读取到最后不一定存在的数据,产生脏读的现象。再看幻读,如图:假设同时执行了两个事务T1/T2。在事务T1执行范围查询或范围修改的过程中,事务T2插入了属于事务T1范围的数据并提交。这时在事务T1的查询中,发现多了一条数据,或者在T1的事务中,发现这条数据没有被修改过,好像是错觉。这种现象称为幻读。最后看一下不可重复读,如图:假设同时执行了两个事务T1/T2,事务T1在不同时间读取同一行数据的结果可能不同,导致不可重复读的问题。2.事务隔离级别事务隔离级别是为了解决多个并行事务的竞争。但是,脏读、幻读、不可重复读这三种现象在实际应用中的一些业务场景中是不可接受的。因此,SQL标准中定义了四种隔离级别,即:readuncommitted,在这种隔离级别下,可能会出现脏读、不可重复读和幻读。Readcommitted(RC),在这个隔离级别下,可能会出现不可重复读和幻读。可重复读(RR),在这个隔离级别下,可能会产生幻读序列化,在这个隔离级别下,多个并行事务被序列化执行,没有安全问题。在这四个隔离级别中,只有串行化解决了所有问题,但是这个隔离级别的性能是最低的。在MySQL中,InnoDB引擎默认的隔离级别是RR(repeatableread),因为它需要保证事务ACID特性的隔离特性。以上是我对MySQL事务隔离级别的理解。我是被编程耽误的文学汤姆。如果我的分享对你有帮助,请动动手指,分享给更多的人。跟我来,面试不再难!
