Spring事务传播机制是指在多个事务方法相互调用的情况下,事务应该如何进行传播和处理。
Spring定义了七种不同的事务传播行为,分别是:
-
REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
-
SUPPORTS:支持当前事务,如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续执行。
-
MANDATORY:强制要求当前存在事务,如果当前不存在事务,则抛出异常。
-
REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则将当前事务挂起。
-
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将当前事务挂起。
-
NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
-
NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
下面是一个示例代码,在多个事务方法相互调用的情况下,不同的事务传播行为所产生的效果:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRED)
public void addUser(User user) {
userDao.addUser(user);
try {
// 调用另一个方法
addAddress(user);
} catch (Exception e) {
e.printStackTrace();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addAddress(User user) {
userDao.addAddress(user);
}
}
在上面的代码中,addUser方法使用REQUIRED传播机制,如果当前存在事务,则加入该事务;否则,创建一个新事务。在addUser方法中,我们调用了addAddress方法,该方法使用REQUIRES_NEW传播机制,创建一个新事务,并挂起当前事务(如果存在)。这样,即使addAddress方法抛出异常,addUser方法也不会回滚。