【面试】Spring事务面试考点吐血整理(建议珍藏)
1. Spring事务管理的常见方式
在spring中,常见的事务管理方式有以下几种:
- 编程式事务管理。
- 声明式事务管理
- 注解式事务管理
其中,声明式事务管理更为常用。下面详细讲解声明式事务管理。
2. 声明式事务管理
声明式事务管理采用AOP思想,通过解析事务注解为指定的方法增加事务相关的代码,从而实现事务管理的功能。
在spring中,实现声明式事务管理有两种方式:
2.1 XML方式
通过XML配置文件的方式实现声明式事务管理。需要使用<tx:advice>
和<aop:config>
节点进行配置。示例代码如下:
<!-- 数据源相关配置 -->
<bean id="dataSource" class="...
<!-- 配置事务管理器 -->
<bean id="txManager" class="...
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="get*" read-only="true" />
...
</tx:attributes>
</tx:advice>
<!-- 配置AOP -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.xxxx.*.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
2.2 注解方式
通过注解的方式实现声明式事务管理。需要在<tx:annotation-driven>
节点中配置隐式的事务通知,然后使用@Transactional
注解为需要添加事务的方法进行标注。示例代码如下:
<!-- 数据源相关配置 -->
<bean id="dataSource" class="...
<!-- 配置事务管理器 -->
<bean id="txManager" class="...
<!-- 配置事务通知 -->
<tx:annotation-driven transaction-manager="txManager" />
<!-- 在需要添加事务的方法上添加@Transactional注解-->
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional
public void save(User user) {
userDao.save(user);
}
}
3. 事务的隔离级别
在使用Spring事务管理时,需要考虑事务的隔离级别。Spring事务管理中支持以下五个隔离级别:
- DEFAULT:采用数据库的默认隔离级别。
- READ_UNCOMMITTED:脏读,允许读取未提交的数据。
- READ_COMMITTED:不可重复读,保证一个事务提交之后,另一个事务再读取同样的数据会得到新的结果。
- REPEATABLE_READ:可重复读,保证一个事务多次读取同样的数据会得到同样的结果。
- SERIALIZABLE:串行化,保证所有事务依次执行。
示例代码如下:
@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferAmount(String fromAccount, String toAccount, double amount) {
...
}
4. 事务的传播行为
在方法中调用其他方法时,可能需要处理嵌套事务的问题。此时需要考虑事务的传播行为。
Spring事务管理支持以下七种传播行为:
- REQUIRED:如果当前没有事务,则新建一个事务;否则加入当前事务。
- SUPPORTS:支持当前事务,如果当前没有事务,就以非事务的方式执行。
- MANDATORY:使用当前事务,如果当前没有事务,则抛出异常。
- REQUIRES_NEW:新建事务,如果当前有事务,则把当前事务挂起。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前有事务,则挂起该事务。
- NEVER:以非事务方式执行,如果当前有事务,则抛出异常。
- NESTED:如果当前有事务,则在嵌套事务内执行;如果没有,则新建事务。
示例代码如下:
@Transactional(propagation = Propagation.REQUIRED)
public void addOrder(Order order) {
...
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {
...
}
以上就是Spring事务面试考点吐血整理的完整攻略,希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【面试】Spring事务面试考点吐血整理(建议珍藏) - Python技术站