Giter VIP home page Giter VIP logo

Comments (14)

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024

你使用的哪个版本?预览版支持 .net core 2.0的

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024

我用的是1.1.0,不过我试了一下demo,我有一些疑问需要问下

 using (var trans =new WorldPlasticTestContext().Database.BeginTransaction())
            {
                var id = Guid.NewGuid();
                //指定发送的消息标题(供订阅)和内容
                 _publisher.Publish("Banner.services.account.check", new Banner {
                    AddTime=DateTime.Now,
                    BannerType=1,
                    DescTxt="123",
                    Id= id,
                    Image="",
                    IsEnable=true,
                    LinkUrl="",
                    Sort=1,
                    Title="123"
                });
                var ct = new WorldPlasticTestContext();
                ct.Banner.Add(new Banner
                {
                    AddTime = DateTime.Now,
                    BannerType = 1,
                    DescTxt = "123",
                    Id = id,
                    Image = "",
                    IsEnable = true,
                    LinkUrl = "",
                    Sort = 1,
                    Title = "123"
                });
                ct.SaveChanges();
                // 你的业务代码。
                trans.Commit();
            }

        [NonAction]
        [CapSubscribe("Banner.services.account.check")]
        public async Task CheckReceivedMessage(Banner Banner)
        {
            var ct = new WorldPlasticTestContext();
            ct.Banner.Add(Banner);
            ct.SaveChanges();
            await Task.CompletedTask;
        }

id是主键,我定义了同一个ID编号,以我理解应该是banner这个表一条数据都没有插入进去的,但是实际运行是插入了一条数据,那我疑问是既然保持不了事务一致性,那var trans =new WorldPlasticTestContext().Database.BeginTransaction()这句代码意义何在

from cap.

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024

你的用法不对。 CAP在使用EF的情况下默认是用 DI 里面的 DbContext 中取的事务,而你这里是自己new的 DbContext,所以事务不会生效。

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024
private readonly ICapPublisher _publisher;
        private readonly WorldPlasticTestContext _ct;

        public HomeController(ICapPublisher publisher, WorldPlasticTestContext ct)
        {
            _publisher = publisher;
            _ct = ct;
        }

        public IActionResult Index()
        {
            using (var trans = _ct.Database.BeginTransaction())
            {
                var id = Guid.NewGuid();
                //指定发送的消息标题(供订阅)和内容
                 _publisher.Publish("Banner.services.account.check", new Banner {
                    AddTime=DateTime.Now,
                    BannerType=1,
                    DescTxt="123",
                    Id = id ,
                    Image ="",
                    IsEnable=true,
                    LinkUrl="",
                    Sort=1,
                    Title="123"
                });
                _ct.Banner.Add(new Banner
                {
                    AddTime = DateTime.Now,
                    BannerType = 1,
                    DescTxt = "123",
                    Id =id ,
                    Image = "",
                    IsEnable = true,
                    LinkUrl = "",
                    Sort = 1,
                    Title = "123"
                });
                _ct.SaveChanges();
                // 你的业务代码。
                trans.Commit();
            }
            return View();
        }

        [NonAction]
        [CapSubscribe("Banner.services.account.check")]
        public async Task CheckReceivedMessage(Banner Banner)
        {
            _ct.Banner.Add(Banner);
            _ct.SaveChanges();
            await Task.CompletedTask;
        }

我按照你所说的用DI注入方式取事务,但是还是没有保持事务一致性,插入了一条数据,我尝试了把_ct.SaveChanges();注释了,把Id改成2个不同的id,理论上是插入2条数据的,可惜一条也没有插入

from cap.

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024
 _ct.Banner.Add(new Banner
                {
                    AddTime = DateTime.Now,
                    BannerType = 1,
                    DescTxt = "123",
                    Id =id ,
                    Image = "",
                    IsEnable = true,
                    LinkUrl = "",
                    Sort = 1,
                    Title = "123"
                });

这里会引发异常吗?

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024

没有任何报错

from cap.

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024

那不就应该是插入一条数据吗? 这个行为符合预期啊

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024

是的,的确只插入一条数据,但是这个事务里面插入2条记录,无论哪一条记录插入失败,理论上不是应该会回滚事务取消之前插入成功的记录吗

from cap.

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024

Cap.Published 表没有数据吗?

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024

有,有一条为记录是ExpiresAt为NULL,可是我理解(可能是我理解有误)流程不是应该是以下这样的吗?

public IActionResult Index()
        {
            using (var trans = _ct.Database.BeginTransaction())
            {
                 //因为id主键相同注定有一条记录会插入不进去
                var id = Guid.NewGuid();
               //这一条数据肯定是能执行成功
                 _publisher.Publish("Banner.services.account.check", new Banner {
                    AddTime=DateTime.Now,
                    BannerType=1,
                    DescTxt="123",
                    Id = id ,
                    Image ="",
                    IsEnable=true,
                    LinkUrl="",
                    Sort=1,
                    Title="123"
                });
                 //因为上一条记录插入了数据库,这条记录注定会执行失败
                _ct.Banner.Add(new Banner
                {
                    AddTime = DateTime.Now,
                    BannerType = 1,
                    DescTxt = "123",
                    Id =id ,
                    Image = "",
                    IsEnable = true,
                    LinkUrl = "",
                    Sort = 1,
                    Title = "123"
                });
                _ct.SaveChanges();
                // 因为这个事务里面有一条数据是执行失败,理论不是回滚掉以上所有操作(包括插入成功的数据吗)
                trans.Commit();
            }
            return View();
        }

        [NonAction]
        [CapSubscribe("Banner.services.account.check")]
        public async Task CheckReceivedMessage(Banner Banner)
        {
            _ct.Banner.Add(Banner);
            _ct.SaveChanges();
            await Task.CompletedTask;
        }

from cap.

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024

你的理解完全不对。 我建议你完整看一遍文档。
https://github.com/dotnetcore/CAP/wiki

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024

我明白了,你CAP保证不是事务一致性,是确保事务执行性,意思发布了消息,即使消费方死机或者不能执行任务时候,也能保证消费方恢复正常也能继续执行任务,而不是导致任务丢失

from cap.

yang-xiaodong avatar yang-xiaodong commented on July 21, 2024

是的, 这个属于分布式事务中的异步确保机制。

from cap.

bao2314483 avatar bao2314483 commented on July 21, 2024

我看了一下surging应该才是我想要的东西,但是我看了你博客写教程,怎么配置我是看懂了,但是客户端怎么调用还是不太懂

from cap.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.