Давайте представим, что у меня есть два потока, которые выполняют некоторый ориентированный на базу данных код в специфичных для потока TransactionScopes с уровнем изоляции ReadCommitted.Но есть некоторая таблица, данные которой должны быть общими (дубликаты не должны создаваться).
using (var transactionScope = new TransactionScope(IsolationLevel.ReadCommitted))
{
...//some code
if (!_someRepository.IsValueExists(value))
_someRepository.AddData(value);
...//some code
transactionScope.Complete();
}
Проблема в том, что оба потока могут проверить, существуют ли данные примерно в одно и то же время, а если нет - создать дублированные данные (ограничения не помогут: я должен предотвратить исключительную ситуацию).Я думаю, что это тривиальная проблема, но как ее обычно решают?
Я вижу следующее схематическое решение:
using (var transactionScope = new TransactionScope(IsolationLevel.ReadCommitted))
{
...//some code
transactionScope.IsolationLevel = IsolationLevel.ReadUncommitted; //change Isolation Level
lock (_sharedDataLockObject)
{
if (!_someRepository.IsValueExists(value))
_someRepository.AddData(value);
}
transactionScope.IsolationLevel = IsolationLevel.ReadCommitted; //reset IsolationLevel
...//some code
transactionScope.Complete();
}
Первая проблема с этим решением состоит в том, что TransactionScope не поддерживает IsolationLevelмодификация.Но давайте представим, что я использую транзакцию ADO.NET здесь.Тем не менее я не уверен, работает ли он.