事务面试相关

 

一、Mysql中的事务

1.事务的四个特性(ACID

1. 1原子性(Atomicity

事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。

回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

1.2. 一致性(Consistency

数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

1.3. 隔离性(Isolation

一个事务所做的修改在最终提交以前,对其它事务是不可见的。

1.4. 持久性(Durability

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 使用重做日志来保证持久性。

2.事务的并发问题常见名词

2.1丢失修改

 

T1  T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。

 

 

2..2脏读

 

T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据(修改后的数据)。

 

 

2.3不可重复读

 

T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

 

 

2.4幻读

 

T1 读取某个范围的数据,T2 在这个范围内插入或删除新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

 

3. 事务的四个隔离级别

3.1未提交读READ UNCOMMITTED)

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

3.2提交读(READ COMMITTED)

一个事务只能读取已经提交的事务所做的修改,不允许读取尚未提交的数据变更

可以阻止脏读,但是不可重复读或幻读仍有可能发生

3.3可重复读(REPEATABLE READ)

保证在同一个事务中多次读取同样数据的结果是一样的,仍可发生幻读

3.4串行化(SERIALIZABLE)

最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务

之间就完全不可能产生干扰,不会有并发问题发生

 

 

 

 

 

 

 

 

 

 

二、Spring中的事务

1. Spring事务的传播行为(propagation

支持当前事务的情况

REQUIRED(默认): 如果当前存在事务,则加入该事务;如果当前没有事

务,则创建一个新的事务。

SUPPORTS 如果当前存在事务,则加入该事务;如果当前没有事

务,则以非事务的方式继续运行。

MANDATORY 如果当前存在事务,则加入该事务;如果当前没有

事务,则抛出异常。(mandatory:强制性)

不支持当前事务的情况: 

REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当

前事务挂起。

NESTED: REQUIRES_NEW类似,但智齿JDBC,不支持JPAHibernate

NOT_SUPPORTED 以非事务方式运行,如果当前存在事务,则把

当前事务挂起。

NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。

 

2. Spring事务中的五个隔离级别(isolation

2.1默认级别(DEFAULT)

使用后端数据库默认的隔离级别,Mysql 默认采用的

REPEATABLE READ隔离级别 Oracle 默认采用的 READ COMMITTED隔离级别.

2.2未提交读READ UNCOMMITTED)

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

2.3提交读(READ COMMITTED)

一个事务只能读取已经提交的事务所做的修改,不允许读取尚未提交的数据变更

可以阻止脏读,但是不可重复读或幻读仍有可能发生  

2.4可重复读(REPEATABLE READ)

保证在同一个事务中多次读取同样数据的结果是一样的,仍可发生幻读

2.5串行化(SERIALIZABLE)

最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务

之间就完全不可能产生干扰,不会有并发问题发生

 3.@Transactional注解

3.1propagation

见上文二、1

3.2isolation

见上文二、2

3.3timeout

指定事务过期时间,默认为当前数据库的事务过期时间。

3.4readOnly

指定当前事务是否是只读事务。

只读事务:

定义:从设置的时间点(时间点beta)开始到事务结束的过程中,该事务将看不见其他事务所提交的数据,即查询中不会出现别人在beta之后提交的数据。

场景:一次执行多次查询(find)来统计某些信息,这时为了保证数据整体的一致性,要用只读事务

3.5rollbackFor

指定哪些异常可以引起回滚

3.6noRollbackFor

指定哪些异常不可以引起回滚

 

4.回滚失效的情况:

4.1方法不是public修饰

4.2unchecked(空指针、1/0)异常会回滚,checkedIO,超时)异常不会回滚

4.3定义了NorollbackFor属性

4.4数据库要使用支持事务的引擎。Mysqlinnodb

4.5spring没扫到要支持事务的包

5.什么时候要用到事务

对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,我们需要添加事务管理机制进行管理。当对数据库的数据进行操作失败时,事务管理可以很好保证所有的数据回滚到原来的数据,如果操作成功,则保证所有需

猜你喜欢

转载自www.cnblogs.com/lezaa/p/11908980.html