У меня проблема с тем, что мой API получает ColumnId извне (его цель - сделать некоторые обновления в базе данных). Однако, если два запроса с одинаковым Id пытаются получить к нему доступ, я получаю сообщение об ошибке, поскольку две транзакции не могут быть выполнены в одной и той же строке.
Поскольку мне все же необходимо выполнить обе эти функции, есть ли способсоздать класс Singleton или статический класс, который будет обрабатывать эти HTTP-запросы, чтобы в случае отправки API двух запросов с одинаковым ColumnId API выполнял первый, а затем второй?
public MyClass DoStuff(MyClass2 obj, HttpRequestMessage request)
{
MyClass test = new MyClass();
// .Create() creates a session with the database
using (var sc = _sessionManager.Create())
{
try
{
var anotherObj = _repository.FindForUpdate(obj.Id);
//modify anotherObj, save it to the database and set some values for `test` based on anotherObj
}
catch
{
sc.Rollback();
}
}
return test;
}
FindForUpdate
выполняет запрос, подобный следующему:
SELECT * FROM table WHERE id = @Id FOR UPDATE
Лучшее, что я могу придумать, это иметь синглтон (как указано выше), который поставит в очередь и заблокирует using statement
в DoStuff
, еслиИдентификатор тот же, но я не знаю, как это сделать.