gpt4 book ai didi

sql-server-2008 - 使用 EF Code First 锁定

转载 作者:行者123 更新时间:2023-12-04 07:05:16 27 4
gpt4 key购买 nike

我有一张表,其中包含有关汽车的信息(我们称之为 tbl_incoming_car)。该表有一个名为“customer_number”的非唯一列,显示到目前为止已进入系统的汽车数量。同一辆车可以进出很多次,但这只注册一次。

所以,当有新车进来时,我需要获取最后一辆车的编号,将其递增,然后将其保存为新车的“customer_number”。

我知道最简单的方法是为汽车创建一个单独的表,将“customer_number”放在那里,然后在其他表中注册来龙去脉,但这只是一个暴露情况的愚蠢示例。所以讨论这种方法是错误的是没有意义的,我已经知道了:)

正如我所说,每次新车进入系统时,我都必须获取最新添加的行,获取“customer_number”,将其递增并将其保存为原子操作。其他应用程序实例可以尝试做同样的事情,并且数据库必须在“创建任务”期间保留对最后添加的行的请求。

我认为我可以通过将隔离级别设置为可序列化来做到这一点,但我认为它不会阻止读取最后一行,但会阻止插入新行。所以看起来锁定是解决方案。我试过在代码中使用静态对象作为监视器,它工作正常,但当然它仅限于相同的应用程序域,我需要数据库级别的东西。

我认为 EF 中没有任何东西可以在 DB 上设置锁,那么哪种是在表上设置锁并稍后释放它的最佳方式?

谢谢。

最佳答案

到目前为止,这是我想到的最好的方法:

    public void SetTransactionLock(String resourceName)
{
Ensure.IsNotNull(resourceName, "resourceName");

String command = String.Format(
@"declare @result int;
EXEC @result = sp_getapplock '{0}', 'Exclusive', 'Transaction', 10000
IF @result < 0
RAISERROR('ERROR: cannot get the lock [{0}] in less than 10 seconds.', 16, 1);",resourceName);

base.Database.ExecuteSqlCommand(command);
}

public void ReleaseTransactionLock(String resourceName)
{
Ensure.IsNotNull(resourceName, "resourceName");
String command = String.Format("EXEC sp_releaseapplock '{0}';",resourceName);
base.Database.ExecuteSqlCommand(command);
}

由于 EF 中没有内置方法,我将这两个方法添加到我的数据层,并使用它们来声明只允许一个并发操作的“临界区”。

您可以在 try finally block 中使用它。

关于sql-server-2008 - 使用 EF Code First 锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15001942/

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