Pergunta

Não parecem ser muito diferentes opiniões sobre o uso de transações para a leitura a partir de um banco de dados.

citar o artigo DeveloperWorks estratégias de transação: Models e estratégias de visão geral :

Por que você precisa de uma transação se você está apenas a leitura de dados? A resposta é que você não. iniciando um transação para executar um read-only operação contribui para a sobrecarga do processamento de fio e pode causar compartilhada bloqueios de leitura em base de dados (dependendo em que tipo de banco de dados que você está usando e qual o nível de isolamento é definido a).

Como uma opinião contrária, há a seguinte citação de documentação Hibernate acesso e o auto-commit Os dados não-transacional modo

A nossa recomendação é não usar o modo auto numa aplicação, e aplicar apenas as operações somente leitura quando há um desempenho óbvio benefício ou quando as mudanças de código futuro são altamente improváveis. prefira sempre transações ACID regulares ao grupo suas operações de acesso a dados, independentemente de se você ler ou gravação de dados.

Há também um debate semelhante na lista de discussão EclipseLink aqui .

Então, onde está a verdade? São transações para ler best-prática ou não? Se ambos são soluções viáveis, quais são os critérios para o uso de transações?

Tanto quanto eu posso ver ele só faz diferença se o nível de isolamento é maior do que 'read committed'. É este correto?

Quais são as experiências e recomendações?

Foi útil?

Solução

Steven Devijver forneceu algumas boas razões para começar as operações, mesmo que as operações só vão ler o banco de dados:

  • Definir limites de tempo ou modos de bloqueio
  • Definir nível de isolamento

padrão SQL requer que mesmo uma consulta deve iniciar uma nova transação se não houver nenhuma transação em andamento. Há DBMS onde não é isso que acontece - aqueles com um modo autocommit, por exemplo (a declaração inicia uma transação e comete-lo imediatamente as concluída declaração). Outros DBMS fazer declarações atômica (efetivamente auto-consolidação) por padrão, mas iniciar uma transação explícita com uma declaração como 'BEGIN WORK', cancelando autocommit até o próximo COMMIT ou ROLLBACK (IBM Informix Dynamic Server é um tal - quando o banco de dados não é MODO ANSI).

Eu não tenho certeza sobre o conselho para nunca mais rollback. Não faz diferença para a transação somente leitura, e na medida em que irrita seus DBAs, então é melhor evitar ROLLBACK. Mas se o seu programa sai sem fazer um COMMIT, o DBMS deve fazer um ROLLBACK em sua transação incompleta -. Certamente se modificou o banco de dados, e (para simplificar), mesmo se você os dados selecionada somente

No geral, se você quiser alterar o comportamento padrão de uma série de operações, use uma transação, mesmo se a transação é somente leitura. Se você está satisfeito com o comportamento padrão, então não é crucial para usar uma transação. Se o código é para ser portátil entre DBMS, o melhor é assumir que você vai precisar de uma transação.

Outras dicas

Em primeiro lugar, isso soa como uma otimização prematura. Como Steven apontou, a maioria dos bancos de dados sãos está indo para colocá-lo em uma transação de qualquer maneira, e todos eles estão realmente fazendo é chamando commit depois de cada afirmação. Então a partir dessa perspectiva, autocommit pode ser menos eficaz uma vez que cada declaração tem que começar uma nova transação. Ou talvez não. Apenas o benchmarking irá dizer e eu aposto que não faz um pingo de diferença para a sua aplicação.

Uma das razões por que você quer usar sempre uma transação é a consistência de proteção. Se você começar a mexer com declarar manualmente uma transação somente quando você "necessidade", em seguida, em seguida, você vai esquecer em um momento crítico. Ou que, supostamente, só de leitura conjunto de operações de repente não é, ou porque um programador depois não sabia que era suposto ser ou porque seu código chama uma função que tem uma gravação escondida. Por exemplo, eu configurar meus clientes de banco de dados de linha de comando não autocommit. Isto significa que posso dedo gordo uma consulta de exclusão e ainda rollback.

Há o nível de isolamento, como apontado. Isto permite-lhe fazer várias lê sem se preocupar se algum outro processo tem escrito aos seus dados entre eles fazer sua lê efetivamente atômica. Isto irá salvá-lo de muitas horas de depuração uma condição de corrida.

E, finalmente, muitas vezes você pode definir uma transação a ser somente leitura. Isto verifica sua suposição e será erro se algo tenta escrever.

Aqui está um artigo agradável soma tudo isso . os detalhes são o Oracle específico, mas os conceitos são genéricos.

Transaction são necessários para operações somente leitura se você quiser definir um tempo limite específico para outros que o tempo limite padrão, ou se você quiser alterar o nível de isolamento.

consultas

Além disso, cada banco de dados - não sei sobre exceções - vai começar internamente uma transação para cada consulta. É geral considerada não feito para transações de reversão quando essa reversão não é necessária.

DBA pode ser monitorar a atividade de reversão, e qualquer comportamento de reversão padrão irá irritá-los nesse caso.

Assim, as transações são usadas de qualquer maneira se você iniciá-los ou não. Se você não precisa deles não iniciá-los, mas nunca fazer um rollback nas operações somente leitura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top