2016-12-22 8 views
1

Я знаю, может быть, я прошу что-то глупое в моем приложении, пользователи могут создавать своего рода повестки дня, но только определенное количество повесток дня разрешено в день. Таким образом, пользователи выполняют этот псевдокод:Как получить обоюдное исключение по отдельным запросам в 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.

ответ

2

это звучит, как у вас есть проблемы архитектуры, но вы можете быть в состоянии выполнить это требование с:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

Если вы читаете вставку в пределах одной и той же сделки, я не вижу, где проблема будет, но если вы ожидаете интерактивного ввода на основе подсчета, то вы, вероятно, должны убедиться, что это сделаете в течение одного сеанса реализации какой-либо функции очередей

+0

Спасибо, ооооооо. Но что вы имеете в виду: «У меня проблема архитектуры»? Я имею в виду ... предположим, что разрешенные повестки дня равны 4, и есть уже 3 завершенные повестки дня. Если два или более пользователя одновременно выполняют выбор count() без взаимного исключения, они получат и 3, и поэтому оба они создадут новую повестку дня ... вместо этого нужно только одно, а второе, после получения блокировки, должен получить 4 из select count(), и поэтому ему не следует создавать новую повестку дня ... –

+0

Неясно, какая версия SQL-сервера вы используете, но если есть предел для данного дня, я бы заставил пользователей читать последнее значение из последовательности и управлять поведением о том, достигнут ли предел или нет. –

+0

[link] (https://msdn.microsoft.com/en-us/library/ff878091.aspx) –