|
|
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
Добрый день. С сервера приложений вставляются записи в 5 таблиц по 10-15 атрибутов(строковые до 200симв, числовые, даты) в каждой, вставляется по 100к-300к строк в каждую таблицу. Во время загрузки к этим таблицам в других транзакциях могут идти select запросы. Таких загрузок может идти несколько параллельных(разные транзакции). В результате проверок на сервере приложений может возникнуть необходимость откатить все загружаемые данные в конце загрузки. Вижу 2 варианта: 1. Вставка всех строк всех таблиц в одной транзакции, commit после вставки всех строк всех таблиц. При необходимости отката вызвать один rollback. Удобно и быстро в плане реализации - достаточно вызвать один rollback для отката данных из всех таблиц, какие тут могут быть минусы? Ресурсов для UNDO TS хватает, блокировок вроде не должно быть, запросы будут только select во время загрузки, по идее могут возникнуть блокировки при параллельных загрузках. 2. Вставка и коммит батчем по n строк в каждую таблицу, при необходимости отката удаление данных из таблиц. В плане реализации сложнее - нужны дополнительные механизмы контроля чтобы другие запросы не брали данные из незавершенной загрузки, например вставка во временную таблицу или использование флагов и механизмы очистки данных незавершенных таблиц при сбое удаления из них(например падение app-сервера в момент загрузки). Подскажите, пожалуйста, какой вариант лучше использовать исходя из описанных объемов, какие +/- я упустил? Пока что сделал по 1 варианту из за простоты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 15:35 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
Промежуточный коммит лучше. Если в длинной транзакции что-то пойдёт не так, то если её обрывать и перезапускать то сначала придётся ждать длинного отката, а затем всё сначала начинать. Бывали случаи в практике, когда что-то шло не так в длинной транзакции, например план у кого-то DELETE слетал, обнаруживали это когда уже транзакция вместо, скажем, запланированных N часов выполнялась 5*N часов. И оборвать нельзя, т.к. огромная задержка по времени даже до того момента пока её снова запустить можно будет. И ждать окончания долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 16:22 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
Наверное, в первую очередь, надо оценить -- а можно ли проиденфицировать строки обработанные и подлежащие обработке Если можно -- то можно и кусками по 1000-1000000, админы смогут спокойно свое пиво пить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2018, 13:50 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
Начнем с того что прежде всего транзакция это понятие бизнеса. Поэтому определи приемлем ли промежуточный коммит с точки зрения бизнес логики. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2018, 14:39 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
SYНачнем с того что прежде всего транзакция это понятие бизнеса. Поэтому определи приемлем ли промежуточный коммит с точки зрения бизнес логики. SY. В подавляющей массе бизнесового функционала - приемлем. Мало смысла повторно проводить верификации 90+% содержимого пакетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2018, 16:34 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
д0kХ В подавляющей массе бизнесового функционала - приемлем. Мало смысла повторно проводить верификации 90+% содержимого пакетов. Каких пакетов? Это ты о чем? авторС сервера приложений вставляются записи в 5 таблиц по 10-15 атрибутов(строковые до 200симв, числовые, даты) в каждой, вставляется по 100к-300к строк в каждую таблицу. Во время загрузки к этим таблицам в других транзакциях могут идти select запросы. Вот тут и основной вопрос. Что будет с точки зрeния бизнеса ecли "select запросы" будут видеть частично загруженные данные. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2018, 17:38 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
ЩПромежуточный коммит лучше. Если в длинной транзакции что-то пойдёт не так, то если её обрывать и перезапускать то сначала придётся ждать длинного отката, а затем всё сначала начинать. Переводя на русский язык Ваша фраза означает: неумение написать рабочий код порождает неконсистентные, с точки зрения бизнеса, данные. Вы правы, именно так обычно и бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2018, 11:13 |
|
||
|
Одна длинная транзакция или несколько батчей
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за ответы. SYВот тут и основной вопрос. Что будет с точки зрeния бизнеса ecли "select запросы" будут видеть частично загруженные данные По идее не будут. Можно вставлять данные во временную таблицу и потом их переносить в основную с помощью если проходят верификацию. Правда не уверен, есть ли в данном случае смысл от этого, убрав одну огромную вставку в основную таблицу добавляется другая - из временной таблицы :D. Буду тестить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2018, 12:15 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=121&tid=1884279]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
20ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 305ms |

| 0 / 0 |
