赞
踩
当一个事务方法(标记为@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 {
-
- @Autowired
- private YourMapper yourMapper;
-
- @Transactional(propagation = Propagation.REQUIRES_NEW)
- public void callProcedureInNewTransaction() {
- try {
- // 调用Mapper方法,该方法内部会调用包含事务的存储过程
- callIndependentProcedure();
- } catch (Exception e) {
- // 异常处理
- // 这里可以根据需要决定是否抛出异常,以决定事务是否回滚
- throw new ServiceException("Error while calling procedure", e);
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。