Spring 面试题, Spring 事务有几个隔离级别?
Spring 面试题, Spring 事务有几个隔离级别?
QA
Step 1
Q:: Spring 事务有几个隔离级别?
A:: Spring 提供了四个主要的事务隔离级别:
1. **READ_UNCOMMITTED**:
这是最低的隔离级别,允许一个事务读取另一个事务尚未提交的数据。这可能导致脏读(Dirty Read)。
2. **READ_COMMITTED**: 确保一个事务只能读取另一个事务已经提交的数据。这能避免脏读,但可能出现不可重复读(Non-
repeatable Read)。
3. **REPEATABLE_READ**:
确保在同一个事务内的多个读取操作总是能够看到相同的数据,即使其他事务修改了数据。它能防止脏读和不可重复读,但可能导致幻读(Phantom Read)。
4. **SERIALIZABLE**:
这是最高的隔离级别,通过强制事务串行执行来防止脏读、不可重复读和幻读,但性能代价较高。
Step 2
Q:: 如何在 Spring 中配置事务隔离级别?
A:: 你可以通过 @Transactional
注解的 isolation
属性来设置事务的隔离级别。例如:
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void someMethod() {
// method implementation
}
此外,你也可以在 XML 配置文件中通过 <tx:advice>
元素来设置事务的隔离级别。
Step 3
Q:: Spring 事务的传播行为有几种类型?
A:: Spring 事务的传播行为定义了事务的传播方式,共有七种类型:
1. **REQUIRED**:
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2. **REQUIRES_NEW**:
总是创建一个新的事务。如果当前存在事务,则将其挂起。
3. **SUPPORTS**:
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
4. **NOT_SUPPORTED**:
总是以非事务方式执行。如果当前存在事务,则将其挂起。
5. **MANDATORY**:
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
6. **NEVER**:
总是以非事务方式执行。如果当前存在事务,则抛出异常。
7. **NESTED**:
如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。
Step 4
Q:: Spring 事务中脏读、不可重复读、幻读分别是什么?
A:: 这些是并发事务处理中可能出现的问题:
1. **脏读 (Dirty Read)**:
一个事务读取了另一个事务尚未提交的数据。如果另一个事务回滚了,这些数据就变得无效。
2. **不可重复读 (Non-repeatable Read)**:
在一个事务中,两次读取同一数据返回了不同的结果,通常是因为在第一次读取之后,另一个事务修改了该数据。
3. **幻读 (Phantom Read)**:
在一个事务中,两次查询的结果集不同,因为在第一次查询之后,另一个事务插入或删除了满足查询条件的数据。
Step 5
Q:: 如何处理 Spring 事务的回滚?
A:: Spring 通过 @Transactional
注解的 rollbackFor
和 noRollbackFor
属性来控制事务的回滚。例如:
@Transactional(rollbackFor = Exception.class)
public void someMethod() {
// method implementation
}
这表示在方法抛出 Exception
及其子类时回滚事务。此外,你也可以通过在 XML 配置文件中配置 <tx:method>
元素来指定回滚规则。