Ado.Net транзакция блокировки

1

Я работаю над приложением e-commerce, у меня есть три таблицы в БД

  1. Клиент
  2. порядок
  3. Информация для заказа

Order Details подробную информацию о отдельных продуктах и OrderId которая является первичным ключом Order и у меня есть 2 Stored Procedures

  1. InsertIntoOrderAndCustomer
  2. InsertIntoOrderDetails

как InsertIntoOrderAndCustomer из ADO.Net он будет генерировать autoid OrderId в Order и мне нужно использовать этот идентификатор в качестве параметра для InsertIntoOrderDetails но я беспокоюсь, если размещено несколько заказов, тогда значение параметра может быть неправильным. Могу ли я заблокировать код C# так, чтобы одновременно был размещен только один заказ? Если да, то как?

Я беспокоюсь о

2 чел.

Исполнение может быть,

Человек А заказывает местонахождение

  1. Вставьте данные в таблицу ордеров для лица А - он автоматически сгенерирует идентификатор IDENTITY (конечно, только один раз).

В то время как Person B накладывает заказ тогда

  1. Вставьте данные в таблицу ордеров для Person B - она автоматически сгенерирует идентификатор IDENTITY (другой).

затем вставьте данные в таблицу product details с помощью AutoId IDENTITY в таблице Orders.

При вставке в product details я получаю автоматический идентификатор с использованием MAX SQL Server и это даст мне 101, как в приведенном выше сценарии.

Возможно ли, что вторая вставка положила IDENTITY Order Лица B (то есть 101) и другие данные Лица A? меня это беспокоит.

  • 1
    Почему значение параметра будет неправильным?
  • 0
    Вы можете использовать lock в C #, как описано здесь . Тем не менее, вы должны пересмотреть это. Как упомянул @MarcGravell, почему это будет неправильно?
Показать ещё 7 комментариев
Теги:
e-commerce
ado.net
locking

1 ответ

1
Лучший ответ

Я думаю, что потенциал для mixup исходит из "Я получаю автоматический идентификатор, используя MAX Sql Server". Если вы вызываете обе хранимые процедуры из кода С# и вызываете их самостоятельно, а второй sproc (InsertIntoOrderDetails) полагается на MAX чтобы получить последний автоматически сгенерированный идентификатор из Orders, тогда да, это зависит от получения идентификатора от пользователя A или B в таблице OrderDetails.

Я могу предложить три подхода. Могут быть и другие:

  1. Верните автоматически сгенерированный идентификатор из Orders в качестве параметра Return или Output для InsertIntoOrderAndCustomer. using scope_identity() Используйте его как входной параметр при вызове второго sproc InsertIntoOrderDetails. Код С# должен знать, какие сведения о клиенте и заказах находятся в контексте.

  2. InsertIntoOrderAndCustomer использовать InsertIntoOrderAndCustomer sproc для автоматического создания идентификатора (используя scope_identity а затем также непосредственно вызвать InsertIntoOrderDetails.

  3. Я не рекомендую это, но с тех пор, как вы спросили. Ваш код С# может использовать EventWaitHandle чтобы разрешить EventWaitHandle кода процедуры только один раз за раз. Это не является масштабируемым, и он также не запрещает микширование с использованием вашего существующего подхода, если процедуры вызывают вне мира С#.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню