Я работаю над приложением e-commerce
, у меня есть три таблицы в БД
Order Details
подробную информацию о отдельных продуктах и OrderId
которая является первичным ключом Order
и у меня есть 2 Stored Procedures
как InsertIntoOrderAndCustomer
из ADO.Net
он будет генерировать autoid
OrderId
в Order
и мне нужно использовать этот идентификатор в качестве параметра для InsertIntoOrderDetails
но я беспокоюсь, если размещено несколько заказов, тогда значение параметра может быть неправильным. Могу ли я заблокировать код C#
так, чтобы одновременно был размещен только один заказ? Если да, то как?
Я беспокоюсь о
2 чел.
Исполнение может быть,
Человек А заказывает местонахождение
IDENTITY
(конечно, только один раз).В то время как Person B накладывает заказ тогда
IDENTITY
(другой). затем вставьте данные в таблицу product details
с помощью AutoId IDENTITY
в таблице Orders.
При вставке в product details
я получаю автоматический идентификатор с использованием MAX
SQL Server
и это даст мне 101, как в приведенном выше сценарии.
Возможно ли, что вторая вставка положила IDENTITY
Order
Лица B (то есть 101) и другие данные Лица A
? меня это беспокоит.
Я думаю, что потенциал для mixup исходит из "Я получаю автоматический идентификатор, используя MAX
Sql Server". Если вы вызываете обе хранимые процедуры из кода С# и вызываете их самостоятельно, а второй sproc (InsertIntoOrderDetails
) полагается на MAX
чтобы получить последний автоматически сгенерированный идентификатор из Orders
, тогда да, это зависит от получения идентификатора от пользователя A или B в таблице OrderDetails.
Я могу предложить три подхода. Могут быть и другие:
Верните автоматически сгенерированный идентификатор из Orders в качестве параметра Return или Output для InsertIntoOrderAndCustomer
. using scope_identity()
Используйте его как входной параметр при вызове второго sproc InsertIntoOrderDetails
. Код С# должен знать, какие сведения о клиенте и заказах находятся в контексте.
InsertIntoOrderAndCustomer
использовать InsertIntoOrderAndCustomer
sproc для автоматического создания идентификатора (используя scope_identity
а затем также непосредственно вызвать InsertIntoOrderDetails
.
Я не рекомендую это, но с тех пор, как вы спросили. Ваш код С# может использовать EventWaitHandle
чтобы разрешить EventWaitHandle
кода процедуры только один раз за раз. Это не является масштабируемым, и он также не запрещает микширование с использованием вашего существующего подхода, если процедуры вызывают вне мира С#.
lock
в C #, как описано здесь . Тем не менее, вы должны пересмотреть это. Как упомянул @MarcGravell, почему это будет неправильно?