|
|
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Доброго дня уважаемые! Вот такая ситуация есть примерная такая табличка Код: plsql 1. id - Primary key есть уникальный индекс по str Есть процесс работающий по такому принципу Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Когда начало работать несколько параллельных процессов появились ошибки дубликатов при инсерте, т.к. между чтением и инсертом другой процесс успевал вставить запись. Переделал код так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Но все равно выглядит некрасиво. Если соседний процесс, вставивший запись, откатит транзакцию получим исключение NO_DATA_FOUND. А есть ли более красивые стандартные решения такой проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:16 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Самонаполняющийся справочник следует наполнять в автономке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:23 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Elic, Ну, это не справочник и его в автономку нельзя никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:31 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Migelleнельзя никак.Тебе, конечно же, виднее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:34 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
MigelleЕсли соседний процесс, вставивший запись, откатит транзакцию, то зададимся вопросом, что же тебе вернул тогда запрос в обработчике DUP_VAL_ON_INDEX ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:37 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Elic, В данном случае я упростил пример до того, что он стал выглядеть как справочник, но на самом деле это не так. env, ID генерится в триггере из сиквенса. После отката это будет несуществующий id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:54 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
MigelleЕсли соседний процесс, вставивший запись, откатит транзакцию получим исключение NO_DATA_FOUND. вот ето непонятно ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:55 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
MigelleВ данном случае я упростил пример до того, что он стал выглядеть как справочник, но на самом деле это не так.Migelleавтономку нельзя никак.Это называется сериализация в конкуренции за ресурс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 10:59 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Что-то подобное решали путем предварительного заполнения базы пустыми значениями, с генерацией необходимых ID. Так что текущая работа делалась не инсертом а апдейтом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 11:24 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
StaxMigelleЕсли соседний процесс, вставивший запись, откатит транзакцию получим исключение NO_DATA_FOUND. вот ето непонятно stax Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Процесс 2 получает NO_DATA_FOUND ElicЭто называется сериализация в конкуренции за ресурс. Хорошо. А есть какие нибудь другие варианты решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 11:38 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Migelleдругие варианты решения?Приведённый упрощённый пример тебе уже решили. http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 11:47 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Migelle, t4 ждет DUP_VAL_ON_INDEX не будет соответственно не будет t6 ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 11:52 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Staxt4 ждет DUP_VAL_ON_INDEX не будет соответственно не будет t6 stax Хм... Точно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 12:06 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
ElicПриведённый упрощённый пример тебе уже решили Я же сказал, что это не справочник и автономные транзакции не подходят. Это заголовок журнала, который не имеет права существовать без подчиненных записей. Неужели если бы я добавил в пример десяток-другой полей как-то повлияло бы на логику работы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 12:20 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
MigelleЭто заголовок журнала, который не имеет права существовать без подчиненных записей.Ну и зачем параллельно создавать один и тот-же "заголовок"? Чтобы всем стоять в очереди? http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 12:23 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
ElicНу и зачем параллельно создавать один и тот-же "заголовок"? Чтобы всем стоять в очереди? Потому что к заголовку параллельно добавляются подчиненные записи множеством процессов. Первый процесс создает заголовок, остальные пользуются им. Это не справочник и автономная транзакция не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 14:23 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Если мастер-запись добавлять после дочерних, в конце основных манипуляций, то время конкуренции за мастера сократится и можно повысить troughput. Вставку мастера, если нет делитов, можно сделать как insert-select-where-not-exists и игнорировать dup_val_on_index. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 14:53 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
де ФеррабляЕсли мастер-запись добавлять после дочерних, в конце основных манипуляций, то время конкуренции за мастера сократится и можно повысить troughput. Вставку мастера, если нет делитов, можно сделать как insert-select-where-not-exists и игнорировать dup_val_on_index. 1) шоб делать детей надо знать ид отца 2) insert-select-where-not-exists не поможет, будут дубли да и загадочный RETURNING id под вопросом ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2017, 15:18 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
MigelleЭто заголовок журнала, который не имеет права существовать без подчиненных записей. Ну так вставь фиктивную дочку а после, отдельным процессом, удали, если нужно. Где вы такое находите.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 14:22 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Staxде ФеррабляЕсли мастер-запись добавлять после дочерних, в конце основных манипуляций, то время конкуренции за мастера сократится и можно повысить troughput. Вставку мастера, если нет делитов, можно сделать как insert-select-where-not-exists и игнорировать dup_val_on_index. 1) шоб делать детей надо знать ид отца Шоб делать детей - отца знать не надо, надо знать на кого записать приплод :) А это вопрос техники генерации идентификаторов и не более того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 14:29 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousШоб делать детей - отца знать не надо, надо знать на кого записать приплод :) А это вопрос техники генерации идентификаторов и не более того. сдесь и обсуждается техника генерации идентификаторов и не более того ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 16:07 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Staxсдесь и обсуждается техника генерации идентификаторов и не более того Тогда непонятно в чем проблема сгенерироать ID, накидать чилдов а затем финальным аккордом обозначить парента. Если сомнения касаются FK, то обратите внимание на ник того, кто это предложил - должно стать яснее :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 16:42 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Migelle, Если ID в таблице не отрицательны, то можно так решить: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Ваш триггер, генерирующий ID, должен поддерживать возможность пользовательской вставки ID: Код: plsql 1. 2. 3. 4. 5. 6. 7. или на худой случай вот так: Код: plsql 1. 2. 3. 4. 5. 6. 7. Хотя я, лично я, строго против таких триггеров и настоятельно рекомендую использовать явную генерацию ID в коде приложения. Триггеров при реализации штатного функционала вообще желательно по возможности избегать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 17:33 |
|
||
|
Паралеллльный инсерт
|
|||
|---|---|---|---|
|
#18+
Небольшие пояснения к предыдущему сообщению: Insert пытается вставить значение в уникальный индекс. При этом ID генерируется случайное, вне диапазона рабочих значений. Диапазон генерируемых значений ID выбран в 1 млрд для уменьшения вероятности блокировок сеансов разных пользователей, одновременно пробующих выполнить вставку значений (разных) в уникальный индекс. Если вставляемое значение уже есть в таблице, то улетаем в exception DUP_VAL_ON_INDEX. В противном случае никто более в другой сессии не сможет вставить такое же значение, какое вставили мы - они будут ждать завершения нашей транзакции в силу наличия уникального индекса на таблице. В случае успешной вставки строки заменяем случайный ID на штатный из последовательности и на этом всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 17:43 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1884939]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 446ms |

| 0 / 0 |
