Pergunta

Estive lendo que alguns devs / DBAs recomendo usar transações em todas as chamadas de banco de dados, mesmo somente leitura chamadas. Embora compreenda a inserção / atualização dentro de uma transacção qual é o benefício da leitura dentro de uma transação?

Foi útil?

Solução

Para que você obtenha uma visão consistente do banco de dados. Imagine que você tem duas tabelas que ligam uns aos outros, mas por algum motivo você fazer 2 seleciona ... em pseuodocode:

myRows = query(SELECT * FROM A)
moreRows = query(SELECT * FROM B WHERE a_id IN myRows[id])

Se entre as duas consultas, alguém muda B para apagar algumas linhas, você vai ter um problema.

Outras dicas

À semelhança do que RoBorg disse, você faria as Seleções w / Transações Eu para impedir a leitura dos dados fantasmas entre as declarações. MAS é importante notar que o nível de isolamento padrão da transação no SQL Server é READ COMMITTED que só vai evita leituras sujas; para evitar que os dados fantasmas você teria que usar pelo menos REPEATABLE READ. "Use esta opção somente quando necessário."

http://msdn.microsoft.com/en-us/library /ms173763.aspx

Eu descobri que se comportam 'transações' de forma muito diferente em servidores SQL diferentes. Em alguns casos, a partir de uma transacção bloqueia todas as outras ligações de ser capaz de executar qualquer SQL até que a transacção está comprometida ou revertida (MS SQL Server 6.5). Outros não têm quaisquer problemas, e só travar quando há uma modificação (Oracle). Os bloqueios podem ainda expandir para abranger unicamente as alterações -. Fechaduras celulares / bloqueios de linha / bloqueios de página / bloqueios de tabela

Normalmente eu uso transações somente quando os dados integridade entre várias instruções insert / delete / update deve ser mantida. Mesmo assim, prefiro implementar isso usando DB-definido exclusões em cascata para que o banco de dados faz isso automaticamente e atomicamente.

Use uma transação se você pode prever uma situação onde você gostaria de reverter várias modificações, mas por outro lado, o banco de dados irá fazê-lo de atualizações atômicas sem o código extra para lidar com ele.

Eu fui conferir esse material nos últimos minutos, já que é algo que eu deveria saber mais sobre. Aqui está o que eu encontrei.

Transações seria útil em torno de uma seleção se você deseja bloquear essa linha, enquanto uma pessoa está lendo registros e não quer que ele modificado ou ler. Por exemplo executar essas consultas:

(em janela de consulta 1)

BEGIN TRAN SELECT * FROM mytable COM (ROWLOCK XLOCK) WHERE ID = 1

(em janela de consulta 2)

SELECT * FROM MYTABLE WHERE ID = 1

(janela de consulta 2 não retornará resultados até que você executar este na janela 1)

COMMIT TRAN

Links úteis:

http://msdn.microsoft.com/en-us/library /aa213039.aspx

http://msdn.microsoft.com/en-us/library /aa213026.aspx

http://msdn.microsoft.com/en-us/library /ms190345.aspx

Meu objetivo era conseguir algo para bloquear - e finalmente funcionou após a adição da XLOCK lá. Simplesmente usando ROWLOCK não estava funcionando. Eu estou supondo que ele estava emitindo um bloqueio compartilhado (e os dados tinha sido lido) .. mas eu ainda estou explorando isso.

Adicionando - COM (UPDLOCK ROWLOCK) - permite-lhe seleccionar e bloquear as linhas de atualizações, o que ajudaria com a concorrência.

Cuidado com dicas de tabela. Se você começar a aplicá-las de forma anárquica, seu sistema vai abrandar para um rastreamento se você ficar ainda um pequeno número de usuários em seu aplicativo. Essa é a única coisa que eu sabia antes de olhar para isso;)

Eu diria que um dos principais efeitos de uma transacção é a oferta potencial de reversão se houver problemas-que é extinta quando a simples leitura.

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