manjiriV Ответов: 1

Управление параллелизмом в C#


i have developed a website for registering to an exam which is published
flow goes like this
1. student register Application id generated Identity col
2. he fills the application form
3. saves
4. when he submits form his roll number is generated so i have written a stored procedure which updates student information and assigns him with a roll number


Что я уже пробовал:

теперь проблема заключается в том, что часто два студента получают один и тот же номер броска, которые одновременно нажимают кнопку сохранения . так как же мне этого избежать? я не могу применить уникальное ограничение, потому что сайт опубликован и он будет через исключение, и я не могу остановить сайт для обслуживания. в настоящее время я вручную запускаю запрос по базе данных для поиска дубликата записи и обновляю его вручную с отсутствующим номером рулона

1 Ответов

Рейтинг:
0

0x01AA

Я предполагаю, что ваш SP делает выбор MAX для генерации номера рулона tol?
В случае если вы используете MSSQL Server 2012 или более позднюю версию я бы посоветовал вам использовать последовательности:
ТПС://MSDN для.Майкрософт.ком/Ан-нас/библиотека/ff878091.aspx-файл[^]


manjiriV

нет, я не использую max вот мой sp.. есть четыре региона для экзамена a city, B city, C, city и D city. таким образом если студент из города его номер списка будет A1928 если 1000 или A10045 если зарегистрировались 45 студентов




ИЗМЕНИТЬ ПРОЦЕДУРУ [SPI].[GenerateRollNumber]
@ApplicantID INT
АС

НАЧАТЬ
--Объявлять переменные
Объявить @ExamCenterId INT=0;
Объявить @ExamCenterName VARCHAR(20);
Объявить @RollNumber VARCHAR(20)=NULL;
DECLARE @ToatlApplications INT=0;
-- Выберите экзаменационный центр и название центра
Выберите @ExamCenterId=ExamCenter,@ExamCenterName=tblExamDistrict. ExamDistrict из TBLAPPLICATIONS INNER JOIN tblExamDistrict ON tblApplications.ExamCenter=tblExamDistrict.ExamDistrictID где ApplicantID=@ApplicantID
--Получить Общий Счет
Выберите @ToatlApplications=COUNT (ApplicationID)+1 из tblApplications, где ExamCenter=@ExamCenterId и tblapplications.RollNumber не является нулевым

IF @ToatlApplications< 10
НАЧАТЬ
Набор @RollNumber = функция concat(верхняя(подстрока(@ExamCenterName, 1, 1)) , '1000' , @ToatlApplications);
КОНЕЦ
Еще если (@ToatlApplications < 100 и @ToatlApplications >= 10)
НАЧАТЬ
SET @RollNumber =CONCAT(UPPER (SUBSTRING(@ExamCenterName, 1, 1)) , '100' , @ToatlApplications);
КОНЕЦ
Еще если (@ToatlApplications < 1000 и @ToatlApplications >= 100)
НАЧАТЬ
SET @RollNumber = CONCAT(UPPER (SUBSTRING(@ExamCenterName, 1, 1)) , '10' , @ToatlApplications);
КОНЕЦ
Еще если (@ToatlApplications >= 1000)
НАЧАТЬ
Набор @RollNumber = функция concat(верхняя(подстрока(@ExamCenterName, 1, 1)) , '1' , @ToatlApplications);
КОНЕЦ

UPDATE tblApplications SET RollNumber=@RollNumber WHERE ApplicantID=@ApplicantID

КОНЕЦ