【发布时间】:2013-09-25 15:21:38
【问题描述】:
如果我有一个在我的网络服务中编辑数据库的函数,如果他们尝试编辑同一行,我只希望一个线程一次执行。
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 的其他线程?
更新
我使用OleDbConnection 和MySqlConnection
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;
【问题讨论】:
-
不应该在数据库端处理吗?您是否真的有问题,或者这只是基于假设?
-
数据访问是怎么写的?如果您使用 EF,这可能会有所帮助:blogs.msdn.com/b/alexj/archive/2009/05/20/…
-
你能展示你是如何访问数据库的吗,许多数据访问方法都内置了很好的工具来处理这个问题(任何发生在客户端的解决方案只有在只有一个客户端连接到数据库。如果您的程序的两个副本都为相同的
checkid调用EditCheck,则当前答案将不起作用) -
@ScottChamberlain 更新了我的问题以包含数据库代码。
标签: c# multithreading