Наилучший подход к входящим запросам
Привет,
Я хотел бы знать лучший подход.
У меня есть 10 разных экранов, обращающихся к одной и той же таблице для уникального номера заказа. Как только экран запрашивает уникальный номер, он генерируется и сохраняется в этой таблице, и это значение отправляется обратно на экран. Это становится проблемой, когда запросы совпадают. Для этой цели мы использовали замки уровня таблицы. Есть ли лучший подход, такой как очередь запросов/сообщений/потоков, чтобы в любой момент времени происходил только один доступ, а другие запросы ставились в очередь и обслуживались асинхронно?
Спасибо
BV
E.F. Nijboer
Замки на уровне стола? Вы используете базу данных? В этом случае используйте автоматически увеличенное поле.
Balaji1982
Спасибо, приятель. Автоматическое приращение здесь не подходит, так как это уникальный номер заказа, который генерируется. Что-то вроде этого.
Формат:
YYYYMMDD+MAX (COUNT (*) FROM TABLE)
Это число на сегодня будет 2012070401, 2012070402, 2012070403....
на завтра будет 2012070501, 2012070502 и так далее
E.F. Nijboer
Вы, конечно, можете добавить еще одну таблицу, в которой есть дата и последнее удостоверение этого предыдущего дня. Таким образом, вы можете получить желаемый номер заказа, найдя соответствующую запись в новой таблице в пределах диапазона. Затем вы берете дату и добавляете идентификатор после вычитания последнего идентификатора предыдущей даты из найденной записи. Хотя это не самое красивое решение, но это идея.
Это действительно может сработать, если вы используете этот двухэтапный способ создания идентификатора, потому что таким образом вы убедитесь, что созданный идентификатор всегда уникален.
Balaji1982
Спасибо, приятель. Решит ли это 10 или более одновременных запросов на уникальный номер заказа? Я хотел бы сохранить текущую структуру таблицы нетронутой, если это возможно, и делать очереди только на уровне кода C#.
E.F. Nijboer
Ну, это должно быть так, потому что столбец identity является первичным ключом и поэтому уникален, иначе он нарушил бы это противопоказание.
Balaji1982
Привет, чувак, идентификационный номер должен начинаться с 1 в день.
Этот номер заказа на сегодня будет 2012070901, 2012070902, 2012070903 ... на завтра будет 2012071001, 2012071002 и так далее.
Я считаю, что нам нужно искать более универсальную систему очередей запросов. Первый в первой реализации.
E.F. Nijboer
Вам нужно будет сохранить последний идентификатор дня и вычесть его из каждого идентификатора на следующий день. Таким образом, он будет начинаться с 1 каждый день.