如果我有一个在我的网络服务中编辑数据库的函数,如果他们尝试编辑同一行,我只希望一个线程一次执行。
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;