MySQL面试—事务篇

155 阅读3分钟

1、事务是什么

简单来说,就是一些涉及到数据强一致性业务流程全流程中,如果有多个操作同时进行, 要么同时成功,要么同时失败,这就是事务。

2、事务的四大特性事务特性

ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

原子性,是指事务包含的所有操作要么全部成功,要么全部失败回滚;

一致性,是指一个事务执行之前和执行之后都必须处于一致性状态。比如 a 与 b 账户共有 1000 块,两人之间转账之后无论成功还是失败,它们的账户总和还是 1000;

隔离性,跟隔离级别相关,如 read committed,一个事务只能读到已经提交的修改;

持久性,指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

3、并发事务带来了哪些问题

了解下几个概念:脏读、不可重复读、幻读。

脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

不可重复读是指在对于数据库中的某行记录,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,另一个事务修改了数据并提交了。

幻读是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行, 就像产生幻觉一样,这就是发生了幻读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

幻读和不可重复读都是读取了另一条已经提交的事务,不同的是不可重复读的重点是修改,幻读的重点在于新增或者删除。

事务隔离就是为了解决上面提到的脏读、不可重复读、幻读这几个问题。

4、事务隔离级别有哪些

MySQL 数据库为我们提供的四种隔离级别。

1)Serializable (串行化)

通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

2)Repeatable read (可重复读)

MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。

3)Read committed (读已提交)

一个事务只能看见已经提交事务所做的改变。可避免脏读的发生。

4)Read uncommitted (读未提交) 所有事务都可以看到其他未提交事务的执行结果。

5、如何查看和设置事务隔离级别

1) 查看隔离级别

select @@transaction_isolation;

2)设置隔离级别

set session transaction isolation level read uncommitted;

6、说说Mybatis事务管理方式

我们日常用的Mybatis数据库ORM框架,对于数据库的事务管理也相应的封装。事务整个过程包含4各步骤:创建、提交、回滚、关闭。

接口如下,

public interface Transaction { Connection getConnection() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; Integer getTimeout() throws SQLException; }

对于此接口的事务实现,MyBatis有两种形式:

  1. JDBC事务管理机制——实现类JdbcTransaction 这种机制是利用对应数据库的驱动生成的Connection对象。完成对事务的提交(commit)、回滚(rollback)、关闭(close)等。

2)MANAGED事务管理机制——实现类ManagedTransaction 这种机制MyBatis自身不会去实现事务管理,而是托管给程序的容器(比如Spring)来实现对事务的管理。