Spring 事务Propagation及其实现原理详解
Spring 事务Propagation是控制事务传播行为的一种机制。在讲解Propagation之前,先对Spring事务做个简要介绍。
Spring事务概述
在Spring中,事务是通过AOP(即Aspect Oriented Programming)实现的。在执行相应方法时,AOP会根据相应的注解(如@Transactional)来判断是否需要为该方法加上事务。
一般情况下,在执行一个方法时,可能会涉及到一个或多个数据库操作,比如查询一个表中的数据和向一个表中插入数据。如果这些操作需要在一个事务中一起完成(即要么全部完成,要么全部不完成),那么我们就可以将这些操作封装进一个Spring事务中,用@Transactional注解来启用这个事务,并指定对应的传播行为Propagation。根据不同的传播行为,Spring会自动创建事务或者复用已存在的事务。
以下是Propagation的几种传播行为:
REQUIRED
表示支持当前事务,如果当前没有事务,就新建一个事务。这是默认的传播行为。
REQUIRES_NEW
表示支持当前事务,但是如果当前有事务,就将当前事务挂起,新建一个事务。
SUPPORTS
表示支持当前事务,如果当前没有事务,就非事务的方式执行。
NOT_SUPPORTED
表示不支持当前事务,如果当前有事务,就将当前事务挂起。
MANDATORY
表示必须支持当前事务,如果当前没有事务,就抛出异常。
NEVER
表示不支持当前事务,如果当前有事务,就抛出异常。
NESTED
表示开启一个新的嵌套事务,如果当前没有事务,就新建一个事务,如果当前有事务,就在当前事务中创建一个嵌套的事务。
事务Propagation示例
下面通过两条示例说明Propagation的作用:
示例一:REQUIRED
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRED)
public void add(User user) {
userDao.insert(user);
}
@Transactional(propagation = Propagation.REQUIRED)
public void update(User user) {
userDao.update(user);
}
}
在示例中,UserService类中有两个方法add和update,这些方法都用@Transactional注解标记,且Propagation都为REQUIRED。这意味着,当add方法和update方法都在同一个事务中时,如果add方法执行失败,update方法也会回滚。
示例二:REQUIRES_NEW
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addRequiredNew(User user) {
userDao.insert(user);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateRequiredNew(User user) {
userDao.update(user);
}
}
在示例中,UserService类中有两个方法addRequiredNew和updateRequiredNew,这些方法都用@Transactional注解标记,且Propagation都为REQUIRES_NEW。这意味着,无论addRequiredNew方法和updateRequiredNew方法是否在同一个事务中,它们都会分别启动各自的事务。
事务实现原理
Spring事务传播行为的实现依靠的是AOP,在执行目标方法时,判断当前是否已经有事务存在,如果有,则直接使用当前事务,如果没有,则开启一个新事务。判断事务是否存在的方式是利用ThreadLocal线程变量存储事务状态。在一个线程中,如果多次调用了@Transactional注解所标注的方法,Spring将会为该线程创建一个事务,并把该事务与这个线程绑定,在当前线程的运行过程中,只有该线程能够访问该事务。
总结
通过本文,我们了解了Spring事务Propagation的几种传播行为,在开发中,我们需要根据实际情况选择相应的传播行为,以达到所需的效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring事务Propagation及其实现原理详解 - Python技术站