Мне нужно обновить таблицу данных, для которой я отправляю данные в формате XML.Моя хранимая процедура имеет транзакцию, чтобы прервать операцию, если что-то пойдет не так.Но количество записей, которые я должен обновить, достаточно велико, и XML достигает 35 МБ +.Это только в разработке, и данные в реальном времени будут еще больше.
Чтобы справиться с этим, я хочу обновить, отправляя данные порциями, то есть я буду отправлять XML для нескольких сотен записей одновременно.Я пытался использовать библиотеку Task
для параллельного обновления БД.
var ret=0;
using(var ts = new TransactionScope(TransactionScopeOption.Required,
new TimeSpan(2,0,0))
{
try
{
for(some condition)
{
get chunk of records
generate xml
create new task and call routing to push data to db
var t = create new task and call routing to push data to db
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
ts.Complete();
foreach(var t in tasks)
ret += t.Result;
}
catch(Exception ex)
{
//log exception and show user message
}
}
return ret;
Но я получаю исключение, что транзакция уже была прервана.
Что мне придется сделатьсделать для обновления в одной транзакции, потому что мне нужно откатить любые изменения, если какой-либо кусок не может обновиться должным образом.
РЕДАКТИРОВАТЬ: - Я использую new TransactionScope(TransactionScopeOption.Required,new TimeSpan(2,0,0))
, как предложено Ридом Копси, но все еще получаюошибка System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
даже после одного вызова базы данных, который завершился через 2-3 секунды.
только для одного вызова