Comments (14)
你使用的哪个版本?预览版支持 .net core 2.0的
from cap.
我用的是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.
你的用法不对。 CAP在使用EF的情况下默认是用 DI 里面的 DbContext 中取的事务,而你这里是自己new的 DbContext,所以事务不会生效。
from cap.
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.
_ct.Banner.Add(new Banner
{
AddTime = DateTime.Now,
BannerType = 1,
DescTxt = "123",
Id =id ,
Image = "",
IsEnable = true,
LinkUrl = "",
Sort = 1,
Title = "123"
});
这里会引发异常吗?
from cap.
没有任何报错
from cap.
那不就应该是插入一条数据吗? 这个行为符合预期啊
from cap.
是的,的确只插入一条数据,但是这个事务里面插入2条记录,无论哪一条记录插入失败,理论上不是应该会回滚事务取消之前插入成功的记录吗
from cap.
Cap.Published 表没有数据吗?
from cap.
有,有一条为记录是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.
你的理解完全不对。 我建议你完整看一遍文档。
https://github.com/dotnetcore/CAP/wiki
from cap.
我明白了,你CAP保证不是事务一致性,是确保事务执行性,意思发布了消息,即使消费方死机或者不能执行任务时候,也能保证消费方恢复正常也能继续执行任务,而不是导致任务丢失
from cap.
是的, 这个属于分布式事务中的异步确保机制。
from cap.
我看了一下surging应该才是我想要的东西,但是我看了你博客写教程,怎么配置我是看懂了,但是客户端怎么调用还是不太懂
from cap.
Related Issues (20)
- .NET Core 8 使用RabbitMQ 报No ip address could be resolved for【hostName】的问题 HOT 1
- Optimizing RabbitMQ Performance and Managing Multiple Instances in CAP HOT 2
- Feature Request: Per-Queue Configuration for BasicQos and ConsumerThreadCount HOT 3
- 消息持久化支持达梦数据库吗 HOT 1
- Is the message data structure compatible with older versions of 3.0? HOT 1
- Add new option for parallel publish send. HOT 2
- Add option for controlling reponse headers from OnSubscribeExecuted HOT 2
- NATS Connection Error after Restarting nats-server: Unable to Publish Messages HOT 5
- SQL Server replication readpast error! "You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels" HOT 3
- 一个进程内可以创建多个CAP吗? HOT 1
- NATS feature: add the possibility to disable dynamic consumer subject/topic creation through NatsCapOtpions HOT 2
- 一个程序进程会操作多个不同的业务数据库,参考#998创建多个发布者进行对应处理,消费者应该如何处理消息? HOT 1
- Feature Request: Add New Column in table Cap.published for relation to table every single data publish HOT 2
- Callback on IIS Idle state HOT 2
- Cap-dashboard empty using dynamic subscribers with Azure Service Bus
- Feature Request:Subscribers can batch process messages HOT 1
- 现在cap支持dm8数据库吗? HOT 2
- I have already developed CAP to support the Dameng database. How can I submit it HOT 1
- Considering adding support for RocketMQ ? HOT 1
- Support for AWS Event Bridge
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cap.