当一个事务方法(标记为@Transactional(propagation = Propagation.NESTED))被另一个活动事务调用时,它会创建一个“保存点”(Savepoint)作为新的事务开始点。这意味着,如果这个嵌套事务方法内部发生异常并导致回滚,事务会回滚到这个保存点,而不会影响到外部事务的其他操作。如果一切正常,嵌套事务会在外部事务结束时一起提交。
标记为@Transactional(propagation = Propagation.REQUIRES_NEW
和Propagation.NESTED 接近但是NESTED不是所有数据库都支持mybatis就不支持
示例:
@Service
public class UserService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void createUserAndSendWelcomeEmail(User user) {userDao.createUser(user);emailService.sendWelcomeEmail(user.getEmail()); // 假设这里可能抛出异常}
}@Service
public class EmailService {@Transactional(propagation = Propagation.NESTED)public void sendWelcomeEmail(String email) {// 发送邮件逻辑// 如果发送邮件失败,此方法的事务会回滚到保存点,不影响createUser操作}
}
其实我感觉这样子,其实可以在ctrl层写,直接在一个ctrl层调用2个service
而当@transation 事务 调用存储过程里面也有事务,怎么独立这两个事务?
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void callIndependentProcedure() {// 调用包含事务处理的存储过程
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class YourService {@Autowiredprivate YourMapper yourMapper;@Transactional(propagation = Propagation.REQUIRES_NEW)public void callProcedureInNewTransaction() {try {// 调用Mapper方法,该方法内部会调用包含事务的存储过程callIndependentProcedure();} catch (Exception e) {// 异常处理// 这里可以根据需要决定是否抛出异常,以决定事务是否回滚throw new ServiceException("Error while calling procedure", e);}}
}