Estou fazendo uma atualização em lote onde processo os registros sequencialmente (Usuário 1, Usuário 2 etc.). Cada registro possui diversas consultas de atualização associadas a ele. Preciso pular se houver um problema de dados para um registro individual (usuário neste caso). Idealmente, gostaria de processá-los em paralelo, mas ainda não atingi esse nível (muitos desafios).
É possível fazer isso de forma que:
- Existe uma única transação.
- Se houver uma falha, as instruções associadas a esse registro serão revertidas, sem afetar outras.
- Comprometer-se.
Por exemplo, tenho 4 usuários em um arquivo CSV. Se 3 forem bons e 1 for ruim, 3 deverão ser confirmados (ou abortados) atomicamente; 1 deve ser ignorado com erros.
Observado:
do everything for user 1;
do everything for user 2;
--> if there is failure, it rolls back the *entire* transaction
do everything for user 3;
Na verdade, qualquer nível de erro >= 16 está revertendo toda a transação.
Esperado:
do everything for user 1;
do everything for user 2;
--> if there is failure, roll back this *block* only
do everything for user 3;
do everything for user 4;
É um try-catch
requisito normal em qualquer linguagem de programação; no entanto, não foi possível ver um equivalente do SQL Server (envolvendo transações). Eu li sobre pontos de verificação, mas não tenho certeza se essa é uma opção a ser considerada.