当前位置: 首页 > 科技观察

我说mysql每张表不能超过100w数据,面试官让我回去等通知?

时间:2023-03-16 12:26:37 科技观察

1。面试题有什么特点?数据库事务的隔离级别是什么?MySQL的默认隔离级别?2.面试官分析了mysql开发的三个基本方面:存储引擎,索引,然后是事务,必须要用到事务。因为在业务系统中,一定要加事务,保证一堆相关的操作,要么一起成功,要么一起失败,对吧?所以这是谈数据库必须要问的问题。使用mysql开发最基本的就是3点:存储引擎(了解)、索引(能够建立索引、使用索引写SQL)、事务(了解事务隔离级别,基于spring的事务支持在代码中添加事务)storageengine->innodb,indexes,indexes基本是根据你的sql要求建的(可能漏了一些index忘记建了),transactions(@Transactional注解,是service层统一加transactions)3.面试题解析3.1ACID事务的先说ACID,你必须知道:(1)Atomic:Atomicity就是一堆SQL,要么一起成功,要么根本不执行,不允许某条SQL成功某条SQL失败,这是废话,不是原子性。(2)Consistency:一致性,这个是为了数据的一致性,也就是一组SQL在执行之前,数据必须是准确的,执行之后,数据也必须是准确的。别瞎折腾半天,执行了SQL之后,却没有给你执行SQL对应的数据修改,那不是作弊吗?(3)Isolation:隔离,这意味着多个事务在运行时不能相互干扰。不让事务A操作一个数据,中途没有完成。结果事务B来改数据,导致事务A操作错误,搞笑。(4)持久性:持久性,如果交易成功,必须永久修改数据才有效。不要让数据过一段时间就消失了,消失了才好玩。3.2事务隔离级别总之,面试问你事务,先说ACID,再说隔离级别(1)ReadUncommitted,ReadUncommitted:这个很坑爹,就是当一个事务还没有提交的时候,修改后的数据,就让其他事务去读,很恶心,也很容易出错。这也称为脏读。(2)ReadCommitted,ReadCommitted(不可重复读):这个比上面那个稍微好一点,但是也比较尴尬。即事务A在运行时,首先查询了一条值为1的数据,然后过了一段时间,事务B修改了数据并提交了。这时事务A再次查询数据,变成了值2,这是其他事务提交的数据,所以读取并提交。这也叫不可重复读,也就是所谓的在一个事务内对一个数据的两次读取,可能会读取到不同的值。如图:(3)Repeatablereading,ReadRepeatable:这个比上面的要好,也就是说事务A在执行过程中,某条数据的值不管重复多少次都是1读;即使在这个过程中,在事务B中修改并提交了数据的值,但是事务A读取的仍然是自己事务开始时数据的值。如图:(4)幻读:不可重复读和可重复读都是针对两个事务同时修改一条数据,但是幻读是针对插入的,比如某个事务修改某个字段所有行的2,另外一个事务插入了一条数据,那个字段的值为1,然后就尴尬了。第一个事务会突然发现多了一条数据,那条数据的字段是1,那么幻读有什么问题呢?因为在这个隔离级别下,比如:事务1要插入一条数据,我先查看是否有相同的数据,但是此时事务2添加了这条数据,会导致事务1插入失败,并且又会考虑不是尴尬,而是尴尬的是查询一次后查询到和它的插入冲突的数据,同时,自己活活死了都不能插入。(5)序列化:如果要解决幻读,需要使用序列化级别的隔离级别,所有的事务都是序列化的,不允许多个事务并行操作。如图:(6)MySQL默认的隔离级别是ReadRepeatable,意思是可重复读,也就是每个事务都会打开它要操作的某个数据的快照。在事务的过程中,读取这个数据的所有快照就可以了,多次读取一个数据是一样的。接下来说说MySQL是如何实现ReadRepeatable的,因为一般我们不会去修改这个隔离级别,但是你得知道是怎么回事。MySQL是通过MVCC机制实现的,也就是多版本并发控制,多版本并发控制。我们在使用innodb存储引擎的时候,会在每一行数据的末尾添加两个隐藏列,一个保存该行的创建时间,一个保存该行的删除时间,但是这里存储的是什么不是时间,而是事务id,事务id是mysql自增的,全局唯一的。事务id在mysql中是全局唯一递增的。transactionid=1,transactionid=2,transactionid=3,transactionid=121,查询id=1的行,会发现创建的事务id<=当前事务id的行select*fromtablewhereid=1,可以在上面一行找到id=122的事务,删除id=1的行,然后删除id=1的行,删除事务id设置为122事务id=121事务,再查询id=1的行,能找到吗?可以发现,要求创建事务id<=当前事务id,当前事务id<删除事务id事务id=121,查询id=2的行,找到事务名=lisi事务id=122,并把id=2的行的名字改成name=小李四事务id=121的事务,查询id=2的行,答案是:李四,创建事务id<=当前事务id,当前transactionid