Я делаю систему выставления счетов с поддержкой нескольких дочерних компаний, каждая из которых имеет свой собственный набор номеров счетов, поэтому у меня есть таблица с первичным ключом (Дочерняя компания, InvoiceNo)Альтернатива Max (ID) в сложном первичном ключе
Я не могу использовать MySQL auto increment field, так как тогда он будет постоянно увеличивать один и тот же счет для всех дочерних компаний.
Я не хочу, чтобы сделать раздельные таблицы для каждой дочерней компании будет новые дочерние компании добавили, как это необходимо ...
я в настоящее время с помощью «Select Max (ID) Где Дочернее = X», из мой стол и добавление счета в соответствии с этим.
Я использую nHibernate и вкладку Invoice, перед вставкой InvoiceItem, поэтому, если вставка Invoice не выполняется, InvoiceItem не будет выполнен. Но вместо этого я поймаю исключение, повторно заберу Max (ID) и повторю попытку.
В чем проблема с этим подходом? А если есть, то какая альтернатива?
Резон для спрашивать, потому что я прочитал один из ответов на этот вопрос: Nhibernate Criteria: 'select max(id)'
Это похоже на то, что я ищу. Не могли бы вы еще раз прояснить процесс блокировки. Нужно ли мне выбирать * из счетов-фактур, где вспомогательный = x для обновления, а затем другой запрос на том же сеансе, чтобы получить максимальный id? –
Вам понадобится таблица «субсидия», в которой у вас есть один ряд за субсидию. Это будет тот ряд, который вы бы заблокировали, чтобы показать, что для субсидии ведется исключительная операция. 'START TRANSACTION', затем' SELECT id FROM publuary WHERE financeuary_id =? FOR UPDATE', затем 'SELECT MAX (id) FROM invoice ...', 'INSERT ...', 'COMMIT'. –
Итак, если вы заблокируете дочернюю строку в вспомогательной таблице, она не позволит вставлять какие-либо новые записи, которые имеют эту строку в качестве ограничения внешнего ключа? Это верно? –