为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第10天 多端全栈项目实战

标签:
SpringBoot

课程名称:多端全栈项目实战,大型商业级代驾业务全流程落地

课程章节:第二章

主讲老师:神思者



课程内容:

    1. 分布式事务

    2.什么时候使用分布式事务?

    3.TX-LCN分布式事务

课程收获:

       接第五天得内容 在写一些 关于微服务项目得看法

        1.分布式事务

            两个服务要纳入到同一个事务之下,这就需要用到分布式事务

            在分布式系统中,事务参与者在不同的分布式节点上或事务操作的数据源不是同一个,这些情况产生的事务都叫做分布式事务



            举例:

                项目A实现Tb_item表新增、项目B实现tb_item_param新增,现在需要实现商品新增,需要把项目A和项目B两个项目新增的方法组成一个事务,这个事务就是分布式事务。

                项目中向MySQL做新增,同时还需要向Redis或MongoDB执行新增,希望执行MySQL或Redis或MongoDB时如果出现异常进行事务回滚,这种情况也成为分布式事务



          2. 什么时候使用分布式事务?

                1个事务(本地事务)就是一系列SQL语句的集合,只要在执行过程中一条SQL出错就会导致整个事务失败,回滚到原点。而在分布式系统中存在多模块完成一次业务。那么就存在一个业务由多模块操作同一个数据源

                https://img1.sycdn.imooc.com/62f59a230001e81c06940339.jpg

                https://img3.sycdn.imooc.com/62f59a400001d3c806840440.jpg

          Seata :  

                Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

        TX-LCN:

                LCN模式是通过代理JDBC中Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。


        TX-LCN和Seata两种分布式事务各有优点。 LCN是采取代理数据源的模式,再根据发起方执行本地事务的结果进行回滚或者提交,可以保证强一致性,但有可能发生死锁的现象。 Seata采取的是根据undo_log日志表,进行逆向生成sql语句,来解决回滚。Seata能保证最终一致性,但可能造成脏读。其实所有的分布式事务方案都不完美, 一致性、可用性、分区容忍性,只能同时满足两个。(这是老师原话 但由于对于这俩都不是很了解  所以下次仔细研究一下)

        

        3.TX-LCN分布式事务

        LCN模式下,需要TM(TX-Manager)程序来协调XA事务,所以我们要创建一个Java项目来充当TM节点。并且还要在MySQL节点中创tx-manager逻辑库导入数据表。

        https://img3.sycdn.imooc.com/62f59b8700014aa208380502.jpg


    TM节点的启动类必须要加上@EnableTransactionManagerServer注解。

@SpringBootApplication@EnableTransactionManagerServerpublic class HxdsTmApplication {

    public static void main(String[] args) {
        SpringApplication.run(HxdsTmApplication.class, args);
    }}

TM节点的配置文件

spring.application.name=TransactionManager
server.port=7970
spring.datasource.driver-class-name=com.mysql.数据库
spring.datasource.url=jdbc:mysql://000.000.000.000:12005/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=abc123456spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=updatespring.redis.host=localhostspring.redis.port=6379
spring.redis.password=密码
spring.redis.database=10
tx-lcn.manager.admin-key=密码
tx-lcn.manager.host=127.0.0.1
tx-lcn.manager.port=8070
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true

在微服务的业务层,需要使用LCN分布式事务的时候,我们就加上@Transactional@LcnTransaction两个注解,这样Service调用DAO执行的数据库操作就被纳入到全局事物当中。


https://img1.sycdn.imooc.com/62f59ced0001996706630483.jpg

在微服务项目的YML文件里面还要设置连接TM节点的配置。

tx-lcn:
  client:
    manager-address: 127.0.0.1:8070



https://img3.sycdn.imooc.com/62f59d3c0001246c13550706.jpg

































                

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消