• 分布式事务 原理及使用范例一则


    摘要:在软件开发和数据库操作中,常常出现须要共同进退的情况。要么一起成功。要么一起失败。

    如果案例:A向B转账3000元rmb。
    update Account set Amount=Amount-3000 where name='a'
    update account set Amount=Amount+3000 where name='b'
    场景:如果在第1行代码运行成功。第2行代码还未运行的情况下。未继续运行。

    结果:A的钱没了!B没收到钱!

    此时推荐使用分布式事务来解决这类问题。


    解决方式
    应该实现原子性:要么所有成功、要么所有失败(回滚)

    事务:
    事务(Transaction)的特征是“原子性”。也就是“要么所有成功。要么所有失败”。

    事务实现还是有非常多方法。最常见的就是使用链接相关SqlTransaction

    SqlTransaction
    长处:1 不须要做client、server端的配置。2 无须启用事务协调服务(MSDTC)
    缺点:无法实现分布式事务、嵌套事务、编写麻烦。


    TransactionScope用来实现分布式事务(能够跨数据库、跨机器操作)的步骤
    1 Windows服务中开启MSDTC(Distributed Transaction Coordinator)。而且启动类型改为“自己主动”。注意:须要在ADO.NET端和数据库端上须要都进行同样操作。

    2 项目加入对System.Transactions的引用
    代码范例:
    //包起来就会两者一起。一起成功。或者一起失败
    using(TransactionScope ts=new TransactionScope())
    {
        "update Account set Amount=Amount-3000 where name='a'";//从A账户扣钱的操作
        "update account set Amount=Amount+3000 where name='b'"//向B账户添加钱的操作
        ts.Complete();//忘记这句话。两个都插入失败
    }
    



  • 相关阅读:
    mybatis中mysql转义讲解
    mybatis结合mysql批量操作及查询sql
    转载:避免重复插入,更新的sql
    maven下载jar包下载不下来的解决方法
    catalina.home与 catalina.base区别
    ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
    普通索引的建立及普通索引的排序
    复合索引的优点和注意事项
    com.mysql.jdbc.PacketTooBigException,及mysql 设置 max_allow_packet
    ./和../和/三种路径的区别
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6801714.html
Copyright © 2020-2023  润新知