TransactionScope, выбирается с помощью Subsonic - PullRequest
2 голосов
/ 25 августа 2009

У меня есть таблица счетов-фактур (и SubSonic 'Invoice' ActiveRecord() со столбцом InvoiceNumebr, который должен иметь уникальные номера. Я пытаюсь GetTheNextAvailableNumber() внутри блока TransactionScope, используя блок. Это работает.

В чем я не уверен, так это в том случае, если 5 или 50 разных пользователей попытаются создать Счет на ок. в то же время метод возвращает один и тот же номер для всех 5 или 50 пользователей, если они не сохранят объект счета-фактуры до более позднего периода.

Метод GetTheNextAvailableNumber(), который вызывается внутри блока TransactionScope, использует запрос Subsonic Select с MAX(), чтобы получить максимальное число, а затем добавляет 1. У самого столбца действительно есть УНИКАЛЬНЫЙ индекс!

Будет ли уровень изоляции Транзакции по умолчанию по умолчанию (Сериализуемый) гарантировать, что каждый из них получит уникальный номер? Или есть более умный механизм для достижения этого? Столбец не может иметь IDENTITY, поскольку в столбце PK InvoiceID он уже есть.

Ответы [ 2 ]

1 голос
/ 25 августа 2009

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

Есть ли шанс, что вы можете использовать Guid?

0 голосов
/ 28 августа 2009

Что если вы создадите вторую таблицу в своей базе данных и сохраните значение NextAvailableNumber в этой таблице. Затем вы использовали бы хранимую процедуру, чтобы получить это значение и увеличить его в том же вызове. Вам просто нужно заблокировать эту хранимую процедуру, чтобы предотвратить одновременные вызовы. Вы также можете заблокировать его в хранимой процедуре.

...