Я использую транзакцию при сохранении данных на SQL SQL Server и Azure Cosmos DB. Насколько я понимаю, как _dbcontext.savechangesasync , так и Transaction.commitasync являются атомными операциями, поэтому я ожидал, что все или ни одна из записей будет сохранена. Согласно официальной документации, «транзакция будет автоматической обработкой при утилизации, если какая-либо команда не удастся». Однако я заметил, что: < /p>
- Все данные успешно вставлены в Azure Cosmos db. < /Strong> < /li>
< li> только некоторые записи появляются в Azure SQL Server.
- Ожидаемое поведение:
SQL Server и Cosmos DB должны хранить одинаковое количество записей. < /li>
< /ul>
< /li>
Вещи, которые я проверил:
redPoints содержит ожидаемое количество элементов перед вставкой. Недавно мы изменили нашу систему журнала, поэтому мы потеряли данные о прошлых журналах, что затрудняет отладку. < /ul>
< /li>
Инструменты:
net: 6.0 < /li>
Microsoft .EntityFrameWorkCore: 7.0.7 - mongodb.drive: 2.22.0
Вопросы: < /strong> < /p>
Что может привести к тому, что SQL Server вставит только некоторые записи, пока космос DB успешно вставляет их все? далее?private async Task SaveRedPointsToDb(
List redPoints,
CancellationToken cancellationToken
)
{
await using var transaction = await _dbContext.Database.BeginTransactionAsync(
cancellationToken
);
try
{
// Azure SQL Server
await _dbContext.RedPoints.AddRangeAsync(redPoints, cancellationToken);
await _dbContext.SaveChangesAsync(cancellationToken);
// Azure Cosmos DB
var redPointDocuments = redPoints.Select(x => new RedPointDocument(x)).toList();
await _redPointCollection.InsertManyAsync(redPointDocuments);
await transaction.CommitAsync(cancellationToken);
}
catch (Exception e)
{
// Log...
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... ithin-a-tr
Мобильная версия