【问题标题】:Sync two server instances against one database针对一个数据库同步两个服务器实例
【发布时间】:2019-11-30 02:10:15
【问题描述】:

我正在使用 C# 和 .NET 框架,并且我有一个连接到数据库的单片服务器。我正在将服务器上传到 AWS 并初始化它的两个实例。

问题在于写入数据库。

我正在使用实体框架,以下是问题代码:

using (var db = new CordioContext())
{
    Student student = db.Students.Where(s => s.Id == studentId).FirstOrDefault();
    student.coursesCount++;
    db.SaveChanges();
} 

当我只有一个服务器实例时,我可以锁定学生 ID,避免两个线程同时尝试更新同一个实体。

当我有两个不同的实例连接到同一个数据库时,我该怎么办?

在微服务架构中是如何做到的?

我已经阅读了一些关于交易的内容,但我不确定这是否能解决我的问题。

上面的示例代码只是为了说明问题。在我的代码中,我更改了更多字段并将所有内容都传输到 SQL 查询而不是 EF 代码,这非常难看。

谢谢!

【问题讨论】:

  • 是的,这正是应该使用数据库事务的场景。
  • 所以如果我用 using (var dbContextTransaction = context.Database.BeginTransaction()) { } 包装我的代码,最后我会放 dbContextTransaction.Commit();它会防止碰撞?
  • 你真的应该考虑乐观并发来检测并发更改,而不需要锁(和事务):docs.microsoft.com/it-it/aspnet/mvc/overview/getting-started/…
  • @iakobski 事务没有解决问题。
  • @FedericoDipuma 主要讲的是版本控制,好像不是一个好的解决方案。

标签: c# .net entity-framework synchronization microservices


【解决方案1】:

“同时更新同一个实体。” - 这种“同时”很少发生,即使它确实发生了,因为您已经在使用实体框架,请使用实体的版本控制。 "更新 XXX 集 (....) 其中 XXX.version_id=old_version_id+1; 这将处理并行更新。数据库写入是序列化的。

【讨论】:

  • 我不确定我理解你的意思。我不想为数据库中的每个实体保存几个版本。
  • 不是新行。版本将是一个存储的列信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2017-12-08
相关资源
最近更新 更多