【发布时间】: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