2016-10-24 2 views
0

Выполняю импорт данных, завернутых в CMSTransactionScope.Kentico транзакции и откат данных

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

Есть ли способ сделать это или нужно его обрабатывать по-разному?

ответ

1

Если вы используете параллельный код для достижения лучшей производительности, и вы в основном вставляете строки один за другим, то маловероятно, что он будет работать лучше, чем при работе в одном потоке. В этом случае я бы рекомендовал использовать одну резьбу в сочетании с CMSTransactionScope и потенциально ConnectionHelper.BulkInsert.

В любом случае, если вы все еще хотите запускать свои запросы параллельно, вам необходимо реализовать некоторую синхронизацию (например, блокировку), чтобы гарантировать, что все операторы будут выполнены до того, как код достигнет CMSTransactionScope.Commit() (это в основном означает потерю производительности). В противном случае запросы будут выполняться в отдельных транзакциях. Кроме того, вы должны убедиться, что объект CMSTransactionScope всегда получает экземпляр с таким же IDataConnection (это должно происходить по умолчанию, когда вы не передаете соединение с конструктором).

Второй подход кажется ошибку, склонной ко мне, и я предпочел бы взглянуть на различные способы оптимизации кода (с использованием асинхр и т.д.)

+0

Я могу определенно понять и согласиться с вами на первом подходе к вставка данных. Как насчет обновления данных? Например, имея транзакцию, а затем циклически параллельно обновляя строки один за другим? Мне интересно, возможно ли это? Или будет ли запрос kentico sql update зависеть, потому что каждый поток имеет новую область подключения? Может быть, я слишком задумываюсь об этом. – user1740075

+0

Если вы это сделаете, например. 'Parallel.ForEach()' внутри 'CMSTransactionScope', я считаю, что он должен работать без каких-либо взаимоблокировок. Область транзакции использует свою собственную область подключения, которая, я надеюсь, будет использоваться повторно даже при использовании нескольких потоков. Однако, я думаю, что прирост производительности будет минимальным, если таковой будет. Лучший способ узнать это - попробовать попробовать :) – rocky

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