gpt4 book ai didi

c# - 仅当值相同时才锁定?

转载 作者:可可西里 更新时间:2023-11-01 09:01:12 25 4
gpt4 key购买 nike

如果我有一个在我的网络服务中编辑数据库的功能,我只希望一个线程在它们试图编辑同一行时同时执行。

void EditCheck(long checkid)
{

if (isCheckCosed)
throw new Exception("check is already closed");

//do stuff

//after i edit my check i want to close it.
CloseCheck();
}

我知道我可以锁定整个函数,但随后我失去了性能,因为不同的线程几乎不会尝试编辑相同的检查。

有没有办法只锁定具有相同 checkid 的其他线程?

更新

我使用 OleDbConnectionMySqlConnection

OleDbCommand oleDbCommand = AccessTrans != null ?
new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
oleDbCommand.ExecuteNonQuery();

MySqlCommand 的相同功能

然后我只使用普通的 INSERT 和 UPDATE sql 命令。和交易是否存在被检查。所以如果你想在上层函数中进行交易,这个函数就可以工作。

为了从数据库中读取,我将填充 DataTable

OleDbCommand oleDbCommand = AccessTrans != null ? new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
OleDbDataAdapter dAdapter = new OleDbDataAdapter();
dAdapter.SelectCommand = oleDbCommand;
dAdapter.Fill(dTable);
return dTable;

最佳答案

您可以使用 ConcurrentDictionary 将每个 id 映射到您可以锁定的对象:

public class Foo
{
private ConcurrentDictionary<long, object> dictionary =
new ConcurrentDictionary<long, object>();

private void EditCheck(long checkid)
{
var key = dictionary.GetOrAdd(checkid, new object());
lock (key)
{
//Do stuff with key
}
}
}

关于c# - 仅当值相同时才锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19008894/

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