关于“事务”的最常问答面试题

    技术2022-07-13  182

    关于“事务”的面试题

    1. 什么是事务?

    百度百科中解释:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

    我的理解:同一根绳上的蚂蚱,要活一起活,要死一起死,事务就是并发控制的单位。

    2. 事务的四大特征(ACID)

    A:原子性(Atomicity) 事务中的操作要么都不做,要么就全做。 C:一致性(Consistency) 事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。 I:隔离性(Isolation)一个事务的执行不能被其他事务干扰 D:持久性(Durability) 也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

    3.不考虑隔离性会产生的3个问题

    1、脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 2、不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果, 中间正好另一个事务更新了该数据,两次结果相异,不可被信任。通俗来讲就是: 事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库, 事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。 3、幻读(虚读):一个事务执行两次查询, 第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。 通俗来讲就是:例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。 而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读

    4. 事务的四种隔离级别

    1.读未提交(Read Uncommitted)引发脏读(读取了未提交的数据)

    2.读已提交(Read Committed)这是大多数数据库系统默认的隔离级别,但不是MySQL默认的只能看见已经提交事务所做的改变引发不可重复读,不可重读读意味着我们同一事务执行完全相同的select语句时可能看到不一样的结果。 导致这种情况的原因可能有: (1)有一个交叉的事务有新的commit,导致了数据的改变; (2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit 多个commit提交时,只读一次出现结果不一致

    3、重复读(Repeatable Read) 重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。重复读可以解决不可重复读问题。应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。 因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。采用Serializable可以解决幻读问题

    4.可串行化 (Serializable) Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

    5. 常用命令

    事务通常以begin(start) transaction 开始,以commit 或 rollback 结束。 commit 表示提交,将事务中所有对数据库的更新写会到磁盘的物理数据库中,事务正常结束。 rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。

    Processed: 0.008, SQL: 9