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

网站添加设置着陆页太原推广团队

网站添加设置着陆页,太原推广团队,企业营销策划的目的,网站方案 模板#x1f680; ShardingSphere #x1f680; #x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 #x1f340; #x1f332; 越难的东西,越要努力坚持#xff0c;因为它具有很高的价值#xff0c;算法就是这样✨ #x1f332; 作者简介#xff1a;硕风和炜 ShardingSphere 算法刷题专栏 | 面试必备算法 | 面试高频算法 越难的东西,越要努力坚持因为它具有很高的价值算法就是这样✨ 作者简介硕风和炜CSDN-Java领域优质创作者保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享 恭喜你发现一枚宝藏博主,赶快收入囊中吧 人生如棋我愿为卒行动虽慢可谁曾见我后退一步 ShardingSphere 目录 一.Sharding-JDBC分布式事务详解 1.1 本地事务 事务四大特性 1.2 分布式事务 1.3 LOCAL vs XA vs BASE 二.Sharding-JDBC分布式事务实战 2.1 数据环境准备 2.2 创建SpringBoot程序 - 导入依赖 2.3 创建SpringBoot程序 - 实体类 2.4 创建SpringBoot程序 - 数据库Mapper接口 主启动类 2.5 创建SpringBoot程序 - 数据加密配置文件 三.Sharding-JDBC分布式事务实战测试 3.1 编写测试接口 - 不做任何事务处理 3.2 编写测试接口 - 添加本地事务处理注解 3.3 编写测试接口 - 添加分布式事务XA 四.总结 五.共勉 一.Sharding-JDBC分布式事务详解 1.1 本地事务 事务四大特性 数据库事务需要满足 ACID原子性、一致性、隔离性、持久性四个特性 原子性Atomicity指事务作为整体来执行要么全部执行要么全不执行一致性Consistency指事务应确保数据从一个一致的状态转变为另一个一致的状态隔离性Isolation指多个事务并发执行时一个事务的执行不应影响其他事务的执行持久性Durability指已提交的事务修改数据会被持久保存。 在单一数据节点中事务仅限于对单一数据库资源的访问控制称之为本地事务。 几乎所有的成熟的关系型数据库都提供了对本地事务的原生支持。 但是在基于微服务的分布式应用环境下越来越多的应用场景要求对多个服务的访问及其相对应的多个数据库资源能纳入到同一个事务当中分布式事务应运而生。 关系型数据库虽然对本地事务提供了完美的 ACID 原生支持。 但在分布式的场景下它却成为系统性能的桎梏。 如何让数据库在分布式场景下满足 ACID 的特性或找寻相应的替代方案是分布式事务的重点工作。 Sharding-JDBC分布式事务详解官方指导手册 1.2 分布式事务 ShardingSphere 对外提供 begin/commit/rollback 传统事务接口通过 LOCALXABASE 三种模式提供了分布式事务的能力。 LOCAL 事务LOCAL 模式基于 ShardingSphere 代理的数据库 begin/commit/rolllback 的接口实现 对于一条逻辑 SQLShardingSphere 通过 begin 指令在每个被代理的数据库开启事务并执行实际 SQL并执行 commit/rollback。 由于每个数据节点各自管理自己的事务它们之间没有协调以及通信的能力也并不互相知晓其他数据节点事务的成功与否。 在性能方面无任何损耗但在强一致性以及最终一致性方面不能够保证。XA 事务采用的是 X/OPEN 组织所定义的 DTP 模型 所抽象的 AP应用程序, TM事务管理器和 RM资源管理器 概念来保证分布式事务的强一致性。 其中 TM 与 RM 间采用 XA 的协议进行双向通信通过两阶段提交实现。 与传统的本地事务相比XA 事务增加了准备阶段数据库除了被动接受提交指令外还可以反向通知调用方事务是否可以被提交。 TM 可以收集所有分支事务的准备结果并于最后进行原子提交以保证事务的强一致性。柔性事务如果将实现了 ACID 的事务要素的事务称为刚性事务的话那么基于 BASE 事务要素的事务则称为柔性事务。 BASE 是基本可用、柔性状态和最终一致性这三个要素的缩写。 基本可用Basically Available保证分布式事务参与方不一定同时在线柔性状态Soft state则允许系统状态更新有一定的延时这个延时对客户来说不一定能够察觉最终一致性Eventually consistent通常是通过消息传递的方式保证系统的最终一致性。 在 ACID 事务中对隔离性的要求很高在事务执行过程中必须将所有的资源锁定。 柔性事务的理念则是通过业务逻辑将互斥锁操作从资源层面上移至业务层面。 通过放宽对强一致性要求来换取系统吞吐量的提升。 1.3 LOCAL vs XA vs BASE 基于 ACID 的强一致性事务和基于 BASE 的最终一致性事务都不是银弹只有在最适合的场景中才能发挥它们的最大长处。 Apache ShardingSphere 集成了 SEATA 作为柔性事务的使用方案。 可通过下表详细对比它们之间的区别以帮助开发者进行技术选型。 二.Sharding-JDBC分布式事务实战 2.1 数据环境准备 在191.168.10.132服务器上创建ljw_position_db0数据库然后在数据库中创建dept职位表和dept_detail职位描述表 在191.168.10.133服务器上创建ljw_position_db1数据库然后在数据库中创建dept职位表和dept_detail职位描述表 。 -- 职位表 CREATE TABLE dept (Id bigint(11) NOT NULL AUTO_INCREMENT,name varchar(256) DEFAULT NULL,salary varchar(50) DEFAULT NULL,city varchar(256) DEFAULT NULL,PRIMARY KEY (Id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;-- 职位描述表 CREATE TABLE dept_detail (Id bigint(11) NOT NULL AUTO_INCREMENT,pid bigint(11) NOT NULL DEFAULT 0,description text,PRIMARY KEY (Id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;2.2 创建SpringBoot程序 - 导入依赖 引入依赖 (注意: 在这里使用ShardingSphere4.1版本为案例进行分布式事务的实战) parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.2.5.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentpropertiesjava.version1.8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.3/version/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.1/version/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactIdversion3.4.1/version/dependencydependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-jdbc-spring-boot-starter/artifactIdversion4.1.0/version/dependencydependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-core-common/artifactIdversion4.1.0/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.10/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.5.8/version/dependencydependencygroupIdcom.github.xiaoymin/groupIdartifactIdknife4j-spring-boot-starter/artifactIdversion2.0.5/version/dependencydependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion20.0/versionscopecompile/scope/dependency!-- XA模式--dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-transaction-xa-core/artifactIdversion4.1.0/version/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build 2.3 创建SpringBoot程序 - 实体类 与数据库表中对应的实体类 TableName(dept) Data ToString public class Dept{TableId(type IdType.AUTO)private Long id;private String name;private String salary;private String city; }TableName(dept_detail) Data ToString public class DeptDetail {TableId(type IdType.AUTO)private Long id;private Long pid;private String description;}2.4 创建SpringBoot程序 - 数据库Mapper接口 主启动类 编写对应的数据库持久层UserMapper接口 Repository public interface DeptMapper extends BaseMapperDept {}Repository public interface DeptDetailMapper extends BaseMapperDeptDetail {}Repository注解的类需要交给我们的Spring容器进行管理因此需要我们在主启动类加上扫描接口的注解。 SpringBootApplication MapperScan(com.ljw.mapper) public class ShardingSphereApplication {public static void main(String[] args) {SpringApplication.run(ShardingSphereApplication.class, args);} } 2.5 创建SpringBoot程序 - 数据加密配置文件 配置读写分离相关配置的信息 # 应用名称 spring.application.namesharding-jdbc-transaction# 打印SQl spring.shardingsphere.props.sql-showtrue# 端口 server.port8888# 配置数据源 spring.shardingsphere.datasource.namesdb0,db1# 数据源1 spring.shardingsphere.datasource.db0.typecom.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.db0.driver-class-namecom.mysql.jdbc.Driver spring.shardingsphere.datasource.db0.jdbc-urljdbc:mysql://192.168.10.132:3306/ljw_position_db0?useUnicodetruecharacterEncodingutf-8useSSLfalse spring.shardingsphere.datasource.db0.usernameroot spring.shardingsphere.datasource.db0.passwordroot# 数据源2 spring.shardingsphere.datasource.db1.typecom.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.db1.driver-class-namecom.mysql.jdbc.Driver spring.shardingsphere.datasource.db1.jdbc-urljdbc:mysql://192.168.10.133:3306/ljw_position_db1?useUnicodetruecharacterEncodingutf-8useSSLfalse spring.shardingsphere.datasource.db1.usernameroot spring.shardingsphere.datasource.db1.passwordroot# 分库策略 spring.shardingsphere.sharding.tables.position.database-strategy.inline.sharding-columnid spring.shardingsphere.sharding.tables.position.database-strategy.inline.algorithm-expressiondb$-{id % 2}spring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.sharding-columnpid spring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.algorithm-expressiondb$-{pid % 2}# 分布式主键生成 spring.shardingsphere.sharding.tables.position.key-generator.columnid spring.shardingsphere.sharding.tables.position.key-generator.typeSNOWFLAKEspring.shardingsphere.sharding.tables.position_detail.key-generator.columnid spring.shardingsphere.sharding.tables.position_detail.key-generator.typeSNOWFLAKE三.Sharding-JDBC分布式事务实战测试 3.1 编写测试接口 - 不做任何事务处理 RestController RequestMapping(/dept) public class DeptController {Autowiredprivate DeptMapper deptMapper;Autowiredprivate DeptDetailMapper deptDetailMapper;RequestMapping(/save)public String saveDept(){for(int i0;i6;i){Dept dept new Dept();dept.setName(Java高级开发工程师 i);dept.setSalary(40K);dept.setCity(北京);deptMapper.insert(dept);// 注意 : 模拟出现 BUG - 然后去数据库中验证数据是否插入if(i 4){throw new RuntimeException(模拟出现 BUG - 然后去数据库中验证数据是否插入);}DeptDetail deptDetail new DeptDetail();deptDetail.setPid(dept.getId());deptDetail.setDescription(这是Java高级开发工程师具体的职位描述 i);deptDetailMapper.insert(deptDetail);}return Save Successfully!;} }启动项目打开浏览器访问接口http://localhost:8888/dept/save到数据库中验证数据 程序出现异常检查数据库, 发现数据库的数据插入了,但是数据是不完整。 3.2 编写测试接口 - 添加本地事务处理注解 主启动类添加EnableTransactionManagement注解开启声明式事务 EnableTransactionManagement SpringBootApplication MapperScan(com.ljw.mapper) public class ShardingSphereApplication {public static void main(String[] args) {SpringApplication.run(ShardingSphereApplication.class, args);} }方法上添加Transactional注解 RestController RequestMapping(/dept) public class DeptController {Autowiredprivate DeptMapper deptMapper;Autowiredprivate DeptDetailMapper deptDetailMapper;TransactionalRequestMapping(/save)public String saveDept(){for(int i0;i6;i){Dept dept new Dept();dept.setName(Java高级开发工程师 i);dept.setSalary(40K);dept.setCity(北京);deptMapper.insert(dept);// 注意 : 模拟出现 BUG - 然后去数据库中验证数据是否插入if(i 4){throw new RuntimeException(模拟出现 BUG - 然后去数据库中验证数据是否插入);}DeptDetail deptDetail new DeptDetail();deptDetail.setPid(dept.getId());deptDetail.setDescription(这是Java高级开发工程师具体的职位描述 i);deptDetailMapper.insert(deptDetail);}return Save Successfully!;} }启动项目打开浏览器访问接口http://localhost:8888/dept/save到数据库中验证数据(项目启动之前要把数据库中原来的数据删除) 程序出现错误检查数据库, 发现数据库中没有任何数据说明数据发生了回滚的操作。 问题来了 问题1: 为什么会出现回滚操作呢此时是分布式环境呀? 难道Transactional注解可以解决分布式事务吗(Transactional不能解决分布式事务) Sharding-JDBC中的本地事务在以下两种情况是完全支持的 支持非跨库事务比如仅分表、在单库中操作支持因逻辑异常导致的跨库事务(这点非常重要)比如上述的操作跨两个库插入数据中间存在逻辑的错误哦 本地事务不支持的情况 不支持因网络、硬件异常导致的跨库事务例如同一事务中跨两个库更新更新完毕后、未提交之前第一个库宕机则只有第二个库数据提交。 对于因网络、硬件异常导致的跨库事务无法支持很好理解在分布式事务中无论是两阶段还是三阶段提交都是直接或者间接满足以下两个条件 ​ 1.有一个事务协调者 2.事务日志记录 本地事务并未满足上述条件自然是无法支持 问题2为什么逻辑异常导致的跨库事务能够支持 Sharding-JDBC中的一条SQL会经过改写拆分成不同数据源的SQL比如一条select语句会按照其中分片键拆分成对应数据源的SQL然后在不同数据源中的执行最终会提交或者回滚。 3.3 编写测试接口 - 添加分布式事务XA 导入sharding-transaction-xa-core依赖 !--XA模式-- dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-transaction-xa-core/artifactIdversion4.1.0/version /dependency方法上添加ShardingTransactionType(TransactionType.XA)注解 RestController RequestMapping(/dept) public class DeptController {Autowiredprivate DeptMapper deptMapper;Autowiredprivate DeptDetailMapper deptDetailMapper;TransactionalShardingTransactionType(TransactionType.XA)RequestMapping(/save)public String saveDept(){for(int i0;i6;i){Dept dept new Dept();dept.setName(Java高级开发工程师 i);dept.setSalary(40K);dept.setCity(北京);deptMapper.insert(dept);// 注意 : 模拟出现 BUG - 然后去数据库中验证数据是否插入if(i 4){throw new RuntimeException(模拟出现 BUG - 然后去数据库中验证数据是否插入);}DeptDetail deptDetail new DeptDetail();deptDetail.setPid(dept.getId());deptDetail.setDescription(这是Java高级开发工程师具体的职位描述 i);deptDetailMapper.insert(deptDetail);}return Save Successfully!;} }启动项目打开浏览器访问接口http://localhost:8888/dept/save到数据库中验证数据(项目启动之前记得清除数据) 程序出现错误检查数据库, 发现数据库中没有任何数据说明数据发生了回滚的操作。 四.总结 本篇文章主要讲解了Sharding-JDBC分布式事务详解与实战实操过程非常重要大家一定要动手亲自实践一下必须掌握。下节预告ShardingProxy实战大家敬请期待呦。 五.共勉 最后我想和大家分享一句一直激励我的座右铭希望可以与大家共勉
http://www.zqtcl.cn/news/928696/

相关文章:

  • 网站session 验证江西星子网
  • 成都高校网站建设服务公司小树建站平台
  • 宁波网站建设 慕枫科技顺德网站设计制作
  • 企业网站如何宣传wordpress 链接修改插件
  • 站长工具官网查询视频网站建设工具
  • 建设彩票网站制作网站服务器
  • 购物网站建设网站怎么购买国外的域名
  • 在线网站排名工具跨境电商卖什么产品最赚钱
  • 电商网页设计网站什么是网络营销产生的现实基础
  • 网站开发需要注意的阿里云做网站可以免备案吗
  • 网站开发后端菜鸟教程本地安装wordpress nginx
  • 网站做端口映射域名怎么做网站
  • 港口建设征收 申报网站网站内容建设与管理
  • 长沙企业网站建设较好的公司个人社保缴费比例
  • 网站备案信息页面惠安网站建设报价
  • 东莞做微网站建设十大免费软件下载
  • 做的很好的黑白网站成都小程序开发
  • 发布做任务网站wordpress新建用户
  • 郑州市东区建设环保局官方网站工作简历模板免费下载
  • 虾皮跨境电商网站公司网站建设费计入什么费用
  • 东光有做网站的吗公司装修图片大全
  • 一个域名下多个网站项目网手游
  • 网站建设竞价托管服务wordpress搬站流程
  • 做视频网站视频文件都存放在哪室内设计网站平台
  • 外贸网站建设网合肥网站设计公
  • 网站建设设计制作 熊掌号一键生成小程序商城
  • 北滘做网站企业展厅 设计 公司 平安
  • 网站做seo外链常州营销型网站建设
  • 乐清门户网站建设网络推广关键词优化公司
  • 自己做的网站被攻击了企业展厅方案设计公司