gpt4 book ai didi

c# - 使用 Entity Framework 和存储过程进行并发检查

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:46 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 并通过存储过程(根据客户请求)在 sqlserver 数据库中操作数据。通过存储过程从数据库中提取数据,这些存储过程的结果填充 Winforms 应用程序中的 SQLite 数据库。

SQLite 用于额外查询和更改数据,然后在用户同步时通过更新存储过程推回 sql server 数据库

所有存储过程都在sql server上(应用程序中没有in text/in line sql)

我遇到了多个用户可能会尝试更新同一字段的情况,这给我带来了 2 个问题。

  1. 如果他们同时调用相同的存储过程(选择或更新)。我不确定从编程层面我的选择是什么,我无权更改服务器。

  2. 如果他们尝试更新的字段已经更新。

对于问题 2,我正在尝试通过标记修改的日期来构建检查。 IE。当用户同步 sql server 将该同步日期添加到日期修改列时,如果另一个用户试图修改同一字段我想检查他的 sqlite 数据库上的修改日期并将其与 sql server 中修改的日期进行比较,如果 sql server 的修改日期较新,保留 sql server 值,如果同步用户的修改日期较新,则使用他的...

我研究了在客户端获胜的情况下解决乐观并发问题。

using (var context = new BloggingContext()) 
{
var blog = context.Blogs.Find(1);
blog.Name = "The New ADO.NET Blog";

bool saveFailed;
do
{
saveFailed = false;
try
{
context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
saveFailed = true;

// Update original values from the database
var entry = ex.Entries.Single();
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
}

} while (saveFailed);

但这似乎只在您使用 Entity Framework 直接查询数据库时有效,而不是在您想要通过存储过程更新时有效。

我可以使用什么来执行这些类型的检查?

最佳答案

好吧,这可能不是最好的解决方案,但这是我能够想出的,虽然最初没有广泛测试过一次似乎还可以。

我不会将此标记为答案,但这是我根据上述问题所做的工作。

  1. 同时调用存储过程,为事务创建一个类

     public class TransactionUtils
    {
    public static TransactionScope CreateTransactionScope()
    {

    var transactionOptions = new TransactionOptions();
    transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
    transactionOptions.Timeout = TransactionManager.DefaultTimeout;
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions);

    }

然后在代码中使用它如下:

var newTransactionScope = TransactionUtils.CreateTransactionScope();

try
{
using (newTransactionScope)
{
using (var dbContextTransaction = db_context.Database.BeginTransaction(/*System.Data.IsolationLevel.ReadCommitted*/))
{
try
{
db_context.Database.CommandTimeout = 3600;

db_context.Database.SqlQuery<UpdateData>("UpdateProc @Param1, @Param2, @Param3, @Param4, @Param5, @Param6, @DateModified",
new SqlParameter("Param1", test1),
new SqlParameter("Param2", test2),
new SqlParameter("Param3", test3),
new SqlParameter("Param4", test4),
new SqlParameter("Param6", test5),
new SqlParameter("DateModified", DateTime.Now)).ToList();

dbContextTransaction.Commit();
}
catch (TransactionAbortedException ex)
{
dbContextTransaction.Rollback();
throw;
}

至于issue 2(并发)我找不到在 SQL Server 上的数据和我想从 SQLite 更新的数据(2 个不同的上下文)之间使用内置并发检查的方法

所以我在 sql server 和 sqlite 中存储修改日期。当用户修改记录时,修改的 sqlite 日期会更新,sql server 上的修改日期在同步运行时更新。在同步之前,我在 sqlServer 数据库中查询要更新的记录的修改日期,并将其与 if 语句中该记录的 sqlite 修改日期进行比较,然后为该记录运行或不运行更新存储过程

关于c# - 使用 Entity Framework 和存储过程进行并发检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46295809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com