PHP面试,事务的特性以及事务的隔离级别。

今天笔试题有一道题是事务的隔离级别,Mysql默认的使用的哪一种。

这道题和同事曾经讨论过很多次,但其实自己一直是一知半解,今天通过看高性能MySQL这本书以及网络上一些资料的查询,以及B上https://www.bilibili.com/video/BV1wb411H7dY?from=search&seid=6442444747702622387 这个老师的视频。自认为对事务的隔离级别有了较为深入的了解。现在做一下简单的记录。

我相信在面试中这样说,是没有问题的。而在工作中,我们如果用到了一定要确定我们的业务需求,不要盲从网上的意见。

以下为面试需要掌握的知识:

一、事务的ACID四个特性。原子性,一致性,隔离性以及持久性。所有符合这4点的才能称之为一个事务。

分别介绍

1.原子性:所谓原子就是指不可分割。而事务我们都知道是多条SQL的一个集合。但是我们要把这些SQL合起来当做一个原子。也就是说如果所有SQL语句都成功了。我们才算成功,才会写到mysql中。如果其中有一条SQL失败,那么就算失败,就不会写到mysql中。

2.一致性:所谓一致性就是指数据之间的关系在操作事务之前和操作事务之后的关系是一致的,是正常的。例如A有一百块钱,B有100块钱。现在有件事是 A给予B 50块钱。   在操作之前A+B为200.而操作之后A+B还是200.

3.隔离性,这个详细在说事务隔离界别时候详细谈,是指事务和事务之间的隔离性。

4.持久性。其实所谓持久性,简单理解就是放到了mysql库中,写入了磁盘中而已。并没有那么多花里胡哨的。

二、事务的隔离级别

首先了解做事务的隔离级别是针对数据一致性来操作的。然后要知道事务隔离级别分为4种。读未提交,读提交,可重复读,可串行化。这四种级别,耗内存CPU也就是耗资源逐步递升。

MySQL默认使用的是可重复读,也就是第三种级别。

一、其中读为提交会产生脏读问题。

所谓脏读,简而言之就是 一个A事务在处理数据时还没有提交,就被另一个事务读到了。  这种隔离级别一般不会使用。

二、其中读提交,解决了脏读问题。但是又出现了不可重复读的问题。

所谓不可重复读,其实指的是,AB两个事务。B事务一开始读了一条数据。假如值为5.

而A事务之后提交了 数据。把值改为了6.那么B事务再次读取数据,就变为了6.也就是数据库现在最新的数据。

这种状况就叫做不可重复读。其实我个人感觉这种才是符合大部分业务需求的。因为我们很多情况都是需要最新的数据。

而Oracle,SQL Server 默认也采用的这种。

三、可重复读

故名意思,这个出来就是为了解决不可重复度的问题。     My SQL默认采用这个。所谓可重复读举个例子。

AB两个事务。B事务读取一个值为5.而A事务把这个值改为了6,而B在此读取还是5.这就叫可重复读。而可重复读又会出现新的

问题,也就是所谓的幻读。 

所谓幻读,其实是针对多条记录来的。不像之前举的例子,是一个值。假如现在有一个班级,25个人。  

B事务读取记录为25.然后A事务给这个班加了一个人。现在26个人了。然后B事务再次查,发现有26个人。

这就是所谓幻读,其实个人不太明白,这不实时展示数据么,有什么问题呢?    层次不够,这种项目没做过,所以理解不到幻读的坏处。

四、可串行化

这个解决了幻读的问题,但是这个耗费了大量的资源。据说用了锁。一直排队搞,事务事务之间排队。这个是解决问题了,但是却忘记了,我们数据库不是为一个人服务的。大部分业务是不能这样搞的,所以据说这个用的也很少。

PS:  以上所有为个人理解,在仔细读了高性能My SQL 以及看了一些网上的资料而写的。如有问题,欢迎留言,如果写错了,我会及时更改。      还有以上内容只针对面试上说, 工作中要慎改事务的隔离界别。不过我感觉我要把自己的mysql 改为可提交读了,也就是第二种了。。。

猜你喜欢

转载自blog.csdn.net/wuye_lh/article/details/106499540