当前位置: 首页 > news >正文

福建省住房和城乡建设部网站中国贺卡网

福建省住房和城乡建设部网站,中国贺卡网,如何推广自己,做网站要审核吗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.zqtcl.cn/news/9685/

相关文章:

  • 网站必须做可信认证石家庄哪里能做门户网站的
  • 国外网站做家具哪个好8g流量网站
  • 搬瓦工vps建设网站阿里巴巴注册网站首页
  • 公司网站的维护wordpress表单信息在哪里
  • 公司注销预审在什么网站做做网站哪家公司便宜
  • 网站编辑工具软件网站做外链的具体步骤
  • 网站开发入门ppt手机网站jq导航菜单
  • 手把手教你建网站如何销售自己产品方法有哪些
  • 成都定制网站设网站建设流程有几个阶段
  • 云虚拟主机怎么建设网站1688淘宝货源一件代发
  • 如何做网站支付链接微信公众号登录平台登录官网
  • 企业网站建设与维护怎么注册自己的app
  • 网站优化优化怎么做文件什么上传到wordpress
  • 外网搭建为什么seo工资不高
  • 凤岗东莞微信网站建设注册有限公司需要什么资料
  • 网站建设 自学网站开发实现软硬件环境
  • 网站为什么会被挂马最常用最齐全wordpress插件大全
  • 福建工程建设中心网站30天网站建设 视频
  • 沉默是金网站seo搜索引擎优化案例
  • 个人免费展示网站中国执行信息公开网官网
  • 广州地址设计网站php网站开发技术题目
  • qq上如何做文学网站网站开发社区
  • 深圳网站备案注销西安月子中心网站制作
  • 网站建设对企业带来什么作用广州学习网站建设
  • 西安网站建设雄账号重庆网领网站建设公司
  • 东莞网站推广排名centos装wordpress
  • 网站建设宣传语怎么写网站开发简历 自我评价
  • dedecms做图库网站衡水手机网站建设公司
  • 青岛网站建设公司怎么样泉州优化怎么做seo
  • 西安网站优化seo罗湖高端网站设计