20240119面试练习题9

1. 什么是事务?为什么需要事务?

事务是一系列操作的集合,这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的最小工作单元。
事务包含了一组操作,这些操作可以是可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,这些操作就都不会执行,前面执行的操作也会回滚原状态,保证了数据的一致性和完整性。如:银行的转账,张三给李四转账,只有当张三账户的钱转走了,并且李四账户的钱收到了之后转账事务才能提交。否则,如果张三账户钱转走了,在李四还没收到钱之前忽然断电或者断网了,本次转账就不会成功。张三和李四账户的状态会回滚到转账前的状态,保证数据一致性,保证数据不会出错。


2. 事务有哪些特性?举例说明一下

事务的特性:
原子性: 强调事务中的多个操作时一个整体
一致性: 强调数据库中不会保存不一致状态
隔离性: 强调数据库中事务之间相互不可见
持久性: 强调数据库能永久保存数据,一旦提交就不可撤销

原子性(Atomicity)
比如我们现在有一个任务要让A账户向B账户转100元,那么我们就需要执行两句
第一个是A账户-100第二个是B账户+100
原子性就是保证这两条数据要么都成功要不都不成功,如果成功一般那么就会出现总数多出100或者少100这样就会造成顾客损失或者公司损失,所以出现不成功或者成果一半就要回滚

一致性(Consistency)
假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性(Isolation)
比如一个人A在发出转账请求时,B去同时查看两个账户余额,B要不看见的是转账前的状态 都是1000块,要不看到的都是转账后的状态,一个900一个1100,而不会看到一个900一个1000或者一个1000一个1100这种中间状态。


3. MySQL如何保证事务四大特性?

原子性:
Innodb中的undo log可以是实现原子性的关键,当事务回滚时会撤销所有已经执行完毕的sql语句,但是需要记录回滚的日志信息。undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

持久性:
innodb中的redo log可以保证持久性。Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。如果此时突然宕机,内存中的数据就会丢失。redo log可解决该问题,当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和bin log内容决定回滚数据还是提交数据。

隔离性:
Mysql利用锁和MVCC多版本并发控制(Multi Version Concurrency Control)来保证隔离性。
一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。
在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。


4. 在日常开发中哪些功能会使用到事务?举例说明一下

1、一个方法中包含多个insert,update,delete操作通过添加事务保证原子性,要么全部成功,要么全部失败。如:
执行方法,添加多个商品。添加事务控制,保障所有商品要么全部添加成功,要么全部添加失败。

2、针对多个表的查询统计,可以通过添加事务控制将统计时间拉起到同一时间节点,保证数据的一致性。
假设现在有3个表A,B,C,由于业务请求量非常高,导致3个表一直有新的数据不停的写入。现在要求分别对3个表中的数据进行聚合统计,然后进行指标计算。如果按照这样去统计,当查询完A指标后,由于业务在正常进行,表B和表C仍然有数据写入,所以最后会导致查询的A,B,C3个指标,并不是同一时刻的,这样的汇总指标也就没有了参考意义,这个时候就需要对统计的方法添加事务,保证数据的一致性。


5. 在开发中是怎样使用事务的?

SpringBoot事务机制
事务处理机制都会提供API来开启事务、提交事务来完成数据操作,或者在发生错误的时候回滚数据,避免数据的不完整性、不一致性。SpringBoot事务机制实质上就是Spring的事务机制,是采用统一的机制处理来自不同数据访问技术的事务处理,提供了一个接口 PlatformTransactionManager,已经为不同数据访问技术可以进行不同的实现

声明式事务
建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
Spring支持声明式事务,被注解的方法在被调用时,Spring开启一个新的事务,当方法无异常结束后,Spring会提交这个事务。


6. MySQL中有哪些事务隔离级别?

READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。


7. 不可重复读和幻读有什么区别?

二者描述的则重点不同,不可重复读描述的侧重点是修改操作,而幻读描述的侧重点是添加和删除操作。
不可重复读 主要是说多次读取一条记录, 发现该记录中某些列值被修改过。
幻读是多次读取一个范围内的记录(包括直接查询所有记录结果或者做聚合统计), 发现结果不一致(标准档案一般指记录增多, 记录的减少应该也算是幻读)


8. 如何解决不可重复读和幻读的问题?

解决不可重复读:
事务隔离级别设置为Repeatable read。
读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。

解决幻读:
事务隔离级别设置为serializable ,数据库就变成了单线程访问的数据库,性能降低很多。


9. 什么是MVCC机制?它能解决幻读问题吗?为什么?

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
在MySQL,MVCC并不是Server级别的实现,而是InnoDB引擎的实现。
快照读
像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;由于是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。
当前读
像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

全部使用快照读
这种情况是最简单的。由于MVCC机制的存在,每个事务开始的时候读取的都是固定的版本的数据。很明显这种情况是不会出现幻读的。

全部使用当前读
由于MySQL间隙锁读存在,后执行的事务会被之前运行的事务阻塞。即退化到串形执行。这种情况也不会存在幻读情况

当前读快照读混用
可重复读隔离级别下,一个事务中只使用当前读,或者只使用快照读都能避免幻读。如果当前读和快照读混用的话就不能保证不出现幻读。


10. MySQL 有哪些重要的日志?

Error Log (错误日志):记录MySQL Server运行时出现的错误和警告
Binary Log (二进制日志):记录了MySQL Server层执行的所有修改操作」
Relay Log ( 中继日志): 主从复制过程中使用的一种日志类型,在从服务器上记录主服务器上所有的二进制日志(Binary log)的信息
DDL Log : 记录DDL操作的一种日志类型。
General Log(查询日志):记录MySQL Server层的所有查询语句
Slow Query Log (慢查询日志): 记录执行时间过长的查询语句


你可能感兴趣的:(面试,java,数据库)