2016-11-30 3 views
0

У меня есть требование автоматического увеличения значения в 2 таблицах с ссылочным отношением. Мое требование состоит в том, чтобы вставить данные в две таблицы: - Таблица A = Rowid, другие столбцы Таблица B = Rowid, другие столбцы Мне нужно вставить данные из разных методов в обе таблицы. В настоящее время я придерживался такого подхода: - a. Запросите максимальное значение из таблицы A и добавьте 1 к нему. b. Вставьте данные в обе таблицы со значением, полученным на шаге 1, с помощью пакетного обновления. Однако недостаток с подходом заключается в том, что два пользователя/потоки одновременно называют этот метод, они могут иметь одинаковое значение, и я получаю ошибку ссылочной межстраничности в таблице A, а таблица B будет иметь 2 строки с одинаковым идентификатором строки.Вставьте max + 1 из одной таблицы в две разные таблицы в пакетном обновлении с java

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

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

Я использую Spring jdbctemplate на стороне java и DB2 на стороне базы данных. Однако проблема не зависит от цели.

+0

Пожалуйста, обратите внимание, я знаю, что есть много вопросов, похоже, похожи на это. Но теперь обновляется две таблицы, а также из внешнего процесса. – Panther

+1

Я предполагаю, что использование уровней изоляции SEQUENCE или выше не является вариантом. Верный? –

+0

@data_henrik right DBA просит обработать код приложения. – Panther

ответ

1

SELECT MAX()+1 не является приемлемым способом создания последовательностей для одновременных транзакций большого объема.

Администратор баз данных отказываясь использовать функции параллелизм DB2, таких как ISOLATION LEVEL, IDENTITY или SEQUENCE объектов неудачно.

Есть приложения обходные пути, которые могут быть использованы:

Оберточных первое утверждение в FINAL TABLE для того, чтобы вернуть вставленные значения, в том числе и MAX() + 1, сгенерированный для TableA.rowid.

Использование возврата ключей от подготовленного оператора:

PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) 
PreparedStatement prepareStatement(String sql, String[] columnNames) 

Затем возвращаемые значения применяются к TableB.rowid

+0

Полностью согласен с вами. Увы, многие люди делают эту ошибку max + 1 вместо того, чтобы позволить системе управлять автоинкрементацией и извлекать результат благодаря финальной таблице ... – Esperento57

+0

Чувак немного смягчил ее. Патетично, и вы не указали ссылочную целостность. – danny117

Смежные вопросы