If i have an function that edits the database in my webservice that i only want one thread to execute at one time if they try to edit the same row.
void Edit
As you want to improve performance, you should make locking at the recent moment as possible. As you use database, you can use DB locking. You got two options:
Select for update
, look at Proper way to SQL select and updateNote that both approaches allows you to use DB resources more than programmatic ones. This is better more that proposed dictionary, why?
Once you will duplicate data, those in DB are duplicated in the runtime dictionary, you are forced to sync them, so if someone updates database and add new id
you need to immediately update dictionary.
Sure, it's doable for small maintaining (e.g. repository) class but once your project gets grow, some of your colleague can forget this information and you will start to find such kind of bugs.
You can use a ConcurrentDictionary
to map each id to an object that you can lock on:
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
}
}
}