直接ip访问网站页面设计介绍
web/
2025/10/3 2:02:47/
文章来源:
直接ip访问网站,页面设计介绍,佛山网站建设天博,so域名的网站Spring事务-两种开启事务管理的方式 1、前期准备2、基于注解的声明式事务管理3、基于编程式的事务管理4、声明式事务失效的情况 例子#xff1a;假设有一个银行转账的业务#xff0c;其中涉及到从一个账户转钱到另一个账户。在这个业务中#xff0c;我们需要保证要么两个账户… Spring事务-两种开启事务管理的方式 1、前期准备2、基于注解的声明式事务管理3、基于编程式的事务管理4、声明式事务失效的情况 例子假设有一个银行转账的业务其中涉及到从一个账户转钱到另一个账户。在这个业务中我们需要保证要么两个账户都成功更新要么都不更新以避免出现数据不一致的情况。以下是基于注解的声明式事务管理和编程式事务管理的示例
1、前期准备 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactIdversion2.5.4/version/dependency首先是实体类 Account
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;Entity
TableName(account)
public class Account {Idprivate Long id; //银行账户的唯一标识符private String accountNumber; //银行账户的账号用于唯一标识一个账户private double balance; //银行账户的余额表示账户当前的可用资金数量// getters and setters
}然后是 AccountRepository
import org.springframework.data.jpa.repository.JpaRepository;
Mapper
public interface AccountRepository extends JpaRepositoryAccount, Long {Account findByAccountNumber(String accountNumber);
}然后是控制器类 BankController
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;RestController
public class BankController {Autowiredprivate BankService bankService;PostMapping(/transfer)public String transfer(RequestBody TransferRequest request) {bankService.transfer(request.getFromAccount(), request.getToAccount(), request.getAmount());return Transfer successful;}
}接下来是请求体类 TransferRequest
public class TransferRequest {private String fromAccount;private String toAccount;private double amount;// getters and setters
}
2、基于注解的声明式事务管理
这种方式使用注解来定义事务通过在需要进行事务管理的方法上添加相应的注解来标识事务的边界和属性。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;Service
public class BankService {Autowiredprivate AccountRepository accountRepository;Transactionalpublic void transfer(String fromAccount, String toAccount, double amount) {Account from accountRepository.findByAccountNumber(fromAccount);Account to accountRepository.findByAccountNumber(toAccount);from.setBalance(from.getBalance() - amount);to.setBalance(to.getBalance() amount);accountRepository.save(from);int i 1/0;accountRepository.save(to);}
}报错事务回滚 在上面的示例中Transactional注解被用于标记transfer方法。这表示transfer方法将被Spring框架管理事务。如果该方法执行过程中发生异常Spring会回滚所有的数据库操作以保证数据的一致性。
3、基于编程式的事务管理
编程式事务管理是一种通过编程方式手动控制事务的管理过程。与声明式事务管理相比它不依赖于特定的注解或配置而是在代码中显式地编写事务管理逻辑。在编程式事务管理中开发人员需要手动管理事务的开始、提交、回滚等过程。
编程式事务管理的主要原理包括以下几个方面 事务定义Transaction Definition 在编程式事务管理中首先需要定义事务的属性包括事务的传播行为、隔离级别、超时时间等。这些定义将决定事务的行为。 事务管理器Transaction Manager 事务管理器负责实际管理事务包括事务的开始、提交、回滚等操作。在编程式事务管理中通常需要手动获取事务管理器并调用其方法来管理事务。 事务的控制 在编程式事务管理中开发人员需要显式地控制事务的开始、提交、回滚等过程。这通常通过调用事务管理器的方法来实现如获取事务、提交事务、回滚事务等。 异常处理 在事务管理过程中可能会出现各种异常情况。开发人员需要适当地处理这些异常例如在捕获到异常时执行事务的回滚操作以保证数据的一致性。 事务边界 在编程式事务管理中需要明确定义事务的边界即事务开始和结束的位置。通常事务的边界由业务逻辑决定在业务逻辑的开始处开启事务在结束处提交或回滚事务。 首先需要定义事务管理器 Bean 在 Spring Boot 应用程序的配置类中使用 Bean 注解定义一个名为 transactionManager 的 DataSourceTransactionManager Bean。确保该 Bean 使用了正确的数据源。 import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;Configuration
public class TransactionConfig {Beanpublic DataSourceTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}service import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;Service
public class BankService {Autowiredprivate AccountRepository accountRepository;Autowiredprivate DataSourceTransactionManager transactionManager;public void transfer(String fromAccount, String toAccount, double amount) {DefaultTransactionDefinition def new DefaultTransactionDefinition();def.setName(transaction-1);def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status transactionManager.getTransaction(def);try {Account from accountRepository.findByAccountNumber(fromAccount);Account to accountRepository.findByAccountNumber(toAccount);from.setBalance(from.getBalance() - amount);to.setBalance(to.getBalance() amount);accountRepository.save(from);accountRepository.save(to);transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);throw e;}}
}在这个示例中我们直接使用了DataSourceTransactionManager来手动管理事务。我们首先定义了一个事务的定义(DefaultTransactionDefinition)然后使用该定义来开启一个事务。如果执行过程中发生异常我们手动回滚事务如果一切正常则手动提交事务。
4、声明式事务失效的情况
Transactional 应用在非 public 修饰的方法上Transactional 注解属性 propagation 设置错误Transactional 注解属性 rollbackFor 设置错误同一个类中方法调用导致Transactional失效异常被catch捕获导致Transactional失效数据库引擎不支持事务
笔者有空再针对这几种情况进行说明
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85951.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!