AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 332433
Accepted
Nishant
Nishant
Asked: 2023-10-23 23:07:59 +0800 CST2023-10-23 23:07:59 +0800 CST 2023-10-23 23:07:59 +0800 CST

Lidar com falhas parciais em uma transação (confirmar seletivamente) em MSSQL

  • 772

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:

  1. Existe uma única transação.
  2. Se houver uma falha, as instruções associadas a esse registro serão revertidas, sem afetar outras.
  3. 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-catchrequisito 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.

sql-server
  • 1 1 respostas
  • 111 Views

1 respostas

  • Voted
  1. Best Answer
    Paul White
    2023-10-25T21:22:46+08:002023-10-25T21:22:46+08:00

    Não é possível confirmar algumas partes de uma transação e reverter outras. Isso anularia o objetivo de uma transação: tudo dentro da transação é bem-sucedido ou falha como uma unidade. Em outras palavras, uma transação é atômica.

    Parece que você não deseja uma transação para todo o processo. Isso significaria que todos os registros foram processados ​​com sucesso ou nenhum foi. Qualquer erro garantiria que o banco de dados persistente retornasse ao estado em que estava antes de qualquer alteração ocorrer.

    Pela sua descrição, parece que você deveria iniciar uma nova transação para cada usuário .

    Execute todas as alterações necessárias para esse usuário e, em seguida, confirme ou reverta, dependendo se alguma condição de erro fatal foi encontrada. Você pode querer incluir um número limitado de novas tentativas para erros transitórios (resolvíveis), como um impasse. Ou registre-os em algum lugar para tentar novamente mais tarde.

    Esse arranjo levaria ao resultado que você indica: usuários sem erros são bem-sucedidos, usuários com erros têm todas as alterações desfeitas.

    Idealmente, você também escreveria sua rotina para reiniciar do ponto de falha em caso de desastre. Isso evita o reprocessamento de dados do usuário que já foram processados ​​com êxito no banco de dados quando ocorreu a falha.

    Para obter um guia completo, consulte Tratamento de erros e transações no SQL Server, de Erland Sommarskog.


    A mudança na execução de uma transação por usuário pode afetar o desempenho. Se você percebe isso depende de quanto trabalho é realizado por usuário e de outros fatores.

    Lembre-se de que cada instrução seria executada em sua própria transação de confirmação automática se você não estivesse usando uma transação explícita.

    Se isso for um fator importante em sua situação específica, você pode usar durabilidade atrasada , melhorar o log do sistema ou executar o processo em mais de um thread, por exemplo.

    Você não precisa necessariamente escrever tudo isso sozinho. Existem muitas ferramentas e tecnologias para ler dados de entrada CSV e canalizar essas alterações para um banco de dados, talvez em paralelo. Por exemplo, SSIS, Azure Data Factory e Synapse Pipelines.

    Sinta-se à vontade para fazer perguntas de acompanhamento separadas, conforme necessário.

    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve