Я знаю, может быть, я прошу что-то глупое в моем приложении, пользователи могут создавать своего рода повестки дня, но только определенное количество повесток дня разрешено в день. Таким образом, пользователи выполняют этот псевдокод:Как получить обоюдное исключение по отдельным запросам в SQL Server
select count(*) as created
from Agendas
where agendaDay = 'dd/mm/yyyy'
if created < allowedAgendas {
insert into Agendas ...
}
Все это, очевидно, ДОЛЖНО выполняться во взаимном исключении. Только один пользователь может прочитать количество созданных повесток и, возможно, вставить новый, если это разрешено.
Как это сделать?
Я попытался открыть транзакцию с уровнем изоляции Read Committed по умолчанию, но это не помогает, потому что во время транзакции другие пользователи все равно могут получить количество созданных программ одновременно с помощью запроса выбора, поэтому попробуйте для вставки нового, даже если он не будет разрешен.
Я не думаю, что изменение уровня изоляции может помочь.
Как это сделать?
Для тестирования я использую SQL Server 2008, а на нашем производственном сервере запускается SQL Server 2012.
Спасибо, ооооооо. Но что вы имеете в виду: «У меня проблема архитектуры»? Я имею в виду ... предположим, что разрешенные повестки дня равны 4, и есть уже 3 завершенные повестки дня. Если два или более пользователя одновременно выполняют выбор count() без взаимного исключения, они получат и 3, и поэтому оба они создадут новую повестку дня ... вместо этого нужно только одно, а второе, после получения блокировки, должен получить 4 из select count(), и поэтому ему не следует создавать новую повестку дня ... –
Неясно, какая версия SQL-сервера вы используете, но если есть предел для данного дня, я бы заставил пользователей читать последнее значение из последовательности и управлять поведением о том, достигнут ли предел или нет. –
[link] (https://msdn.microsoft.com/en-us/library/ff878091.aspx) –