SpringBoot事务详解(含示例代码)

在Spring Boot中,事务是用于管理数据库操作的重要机制。Spring Boot提供了多种方式来处理事务,主要包括编程式事务管理和声明式事务管理。下面是对这两种事务管理方式的分类和代码说明。

事务管理方式

编程式事务管理

 编程式事务管理是通过在代码中显式地控制事务的开始、提交和回滚来管理事务。下面是使用编程式事务管理的代码示例:

import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import import org.springframework.transaction.support.TransactionTemplate;

@Service
public class UserService {
    private final TransactionTemplate transactionTemplate;

    public UserService(TransactionTemplate transactionTemplate) {
        this.transactionTemplate = transactionTemplate;
    }

    public void updateUser(User user) {
        transactionTemplate.execute(new TransactionCallback<Void>() {
            public Void doInTransaction(TransactionStatus status) {
                try {
                    // 更新用户信息
                    userDao.updateUser(user);
                    // 其他数据库操作
                    // ...
                    return null;
                } catch (Exception e) {
                    status.setRollbackOnly();
                    throw e;
                }
            }
        });
    }
}

在上述代码中,TransactionTemplate是Spring提供的用于编程式事务管理的模板类。通过调用execute方法,在其中执行需要进行事务管理的代码逻辑。在执行过程中,可以通过TransactionStatus对象来控制事务的提交或回滚。

声明式事务管理

 声明式事务管理是通过使用注解或XML配置来定义事务的边界和属性,由Spring框架自动管理事务的开始、提交和回滚。下面是使用注解方式的声明式事务管理的代码示例:

import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述代码中,@Transactional注解被应用于updateUser方法上,表示该方法需要进行事务管理。Spring框架会根据注解的配置自动创建事务,并在方法执行结束后根据执行结果决定是提交事务还是回滚事务。

总结起来,编程式事务管理需要在代码中显式地控制事务的开始、提交和回滚,而声明式事务管理通过注解或XML配置来定义事务的边界和属性,由Spring框架自动管理事务的行为。

常用的事务注解

@Transactional:用于标识一个方法需要进行事务管理。

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述示例中,@Transactional注解被应用于updateUser方法上,表示该方法需要进行事务管理。Spring框架会根据注解的配置自动创建事务,并在方法执行结束后根据执行结果决定是提交事务还是回滚事务。

@Transactional(propagation = Propagation.REQUIRED):指定事务的传播行为。

示例代码:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.REQUIRED)
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述示例中,@Transactional(propagation = Propagation.REQUIRED)指定了事务的传播行为为REQUIRED,表示如果当前方法已经存在一个事务,则加入该事务;如果不存在事务,则创建一个新的事务。

@Transactional(isolation = Isolation.READ_COMMITTED):指定事务的隔离级别。

示例代码:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述示例中,@Transactional(isolation = Isolation.READ_COMMITTED)指定了事务的隔离级别为READ_COMMITTED,表示读取已经被其他事务提交的数据,而不能读取到未提交的数据。

@Transactional(rollbackFor = Exception.class):指定回滚条件。

示例代码:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述示例中,@Transactional(rollbackFor = Exception.class)指定了回滚条件为发生任何异常时回滚事务。

这些是一些常见的Spring Boot事务注解及其使用方式。根据你的具体需求,可以选择适当的注解进行事务管理。

SpringBoot事务传播机制

REQUIRED:如果当前方法已经存在一个事务,则加入该事务;如果不存在事务,则创建一个新的事务。

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.REQUIRED)
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void createUser(User user) {
        try {
            // 创建用户
            userDao.createUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述代码中,updateUsercreateUser方法都使用了@Transactional(propagation = Propagation.REQUIRED)注解,表示它们都需要在一个事务中运行。如果在调用updateUsercreateUser方法时已经存在一个事务,则这两个方法将加入该事务。如果不存在事务,则会创建一个新的事务。

REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务。如果当前存在事务,则将该事务挂起。

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void createUser(User user) {
        try {
            // 创建用户
            userDao.createUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述代码中,updateUsercreateUser方法都使用了@Transactional(propagation = Propagation.REQUIRES_NEW)注解,表示它们都需要在一个新的事务中运行。无论当前是否存在事务,都会创建一个新的事务,并在方法执行完毕后提交或回滚该事务。

SUPPORTS:如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行。

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.SUPPORTS)
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userDao.updateUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }

    @Transactional(propagation = Propagation.SUPPORTS)
    public void createUser(User user) {
        try {
            // 创建用户
            userDao.createUser(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            throw e;
        }
    }
}

在上述代码中,updateUsercreateUser方法都使用了@Transactional(propagation = Propagation.SUPPORTS)注解,表示它们以非事务方式执行,但如果当前存在事务,则会加入该事务中进行执行。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫飞雪飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值