每日一题:SpringBoot中支持的事务类型
发布人:shili8
发布时间:2024-12-22 14:18
阅读次数:0
**每日一题:SpringBoot中支持的事务类型**
在 Spring Boot 中,事务是指一组操作的集合,如果其中任何一个操作失败,则整个事务都会回滚,这样可以保证数据的一致性。Spring Boot 支持多种事务类型,我们将在本文中详细介绍。
###1. 声明式事务声明式事务是 Spring Boot 中最常用的事务类型,它通过注解的方式来定义事务的边界。
java@Servicepublic class UserService { @Autowired private UserMapper userMapper; @Transactional // 这里使用@Transactional注解开启事务 public void saveUser(User user) { userMapper.insert(user); // 如果这里插入失败,整个事务都会回滚 int i =1 /0; } }
在上面的例子中,我们使用 `@Transactional` 注解开启了一个事务,如果 `saveUser` 方法中的任何操作失败,则整个事务都会回滚。
###2. 编程式事务编程式事务是通过代码的方式来定义事务的边界,它比声明式事务更灵活,但也更容易出错。
java@Servicepublic class UserService { @Autowired private UserMapper userMapper; public void saveUser(User user) { TransactionStatus status = TransactionAspectSupport.currentTransactionStatus(); if (status.isRollbackOnly()) { // 如果当前事务已经回滚,则不再进行任何操作 return; } try { userMapper.insert(user); // 如果这里插入失败,需要手动回滚事务 int i =1 /0; } catch (Exception e) { status.setRollbackOnly(); throw new RuntimeException(e); } } }
在上面的例子中,我们通过 `TransactionAspectSupport.currentTransactionStatus()` 获取当前事务的状态,如果当前事务已经回滚,则不再进行任何操作。如果这里插入失败,则需要手动回滚事务。
###3. PROPAGATION类型Spring Boot 中支持多种 PROPAGATION 类型,它们决定了事务如何传播到下一个方法中。
java@Servicepublic class UserService { @Autowired private UserMapper userMapper; public void saveUser(User user) { // REQUIRED:如果当前线程存在事务,则使用该事务,否则新建一个事务 TransactionTemplate transactionTemplate = new TransactionTemplate(); transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); transactionTemplate.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { userMapper.insert(user); // 如果这里插入失败,整个事务都会回滚 int i =1 /0; return null; } }); } }
在上面的例子中,我们使用 `REQUIRED` 类型传播当前线程的事务,如果当前线程不存在事务,则新建一个事务。
###4. ISOLATION类型Spring Boot 中支持多种 ISOLATION 类型,它们决定了事务如何隔离其他操作。
java@Servicepublic class UserService { @Autowired private UserMapper userMapper; public void saveUser(User user) { // DEFAULT:使用数据库的默认隔离级别 TransactionTemplate transactionTemplate = new TransactionTemplate(); transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT); transactionTemplate.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { userMapper.insert(user); // 如果这里插入失败,整个事务都会回滚 int i =1 /0; return null; } }); } }
在上面的例子中,我们使用 `DEFAULT` 类型隔离当前线程的操作,如果其他线程正在执行相同的操作,则会出现死锁。
###5. TIMEOUT类型Spring Boot 中支持多种 TIMEOUT 类型,它们决定了事务超时时间。
java@Servicepublic class UserService { @Autowired private UserMapper userMapper; public void saveUser(User user) { // DEFAULT:使用数据库的默认超时时间 TransactionTemplate transactionTemplate = new TransactionTemplate(); transactionTemplate.setTimeout(TransactionDefinition.TIMEOUT_DEFAULT); transactionTemplate.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus status) { userMapper.insert(user); // 如果这里插入失败,整个事务都会回滚 int i =1 /0; return null; } }); } }
在上面的例子中,我们使用 `DEFAULT` 类型超时当前线程的操作,如果超时时间到达,则会出现异常。
综上所述,Spring Boot 支持多种事务类型,它们决定了事务如何传播、隔离和超时。通过选择合适的类型,可以实现高效的数据一致性和可靠性。