Pergunta : Multi-threading e fileira travar sobre seleciona

Olá! lá, o

this é uma pergunta razoavelmente geral e algumas ponteiros, exemplos ou ligações aos cursos seriam great.

I tinham projetado uma base de dados que fosse desdobrada em um ambiente multi-threaded de Java. Basicamente, há os serviços de java que estão funcionando constantemente sobre a base de dados, verific para ver se há novos recorda, atualizando os etc.

I executaram a loja Procs para todas as atualizações, começ etc. e têm tudo transações internas envolvidas dentro do proc da loja. Até agora tão bom.  Entretanto minha maior preocupação é como faço eu paro um registro ou talvez os registros em algumas tabelas que começ atualizados entre o tempo I “selecionam” dados delas à atualização do tempo I realmente o registro e cometem a transação. Tanto quanto eu estou ciente a transação não retrocede dentro, até uma atualização, a supressão ou a inserção é chamada o interior o transporte clause.

So que um exemplo cliente do be

Table tem 2 registros como o so
AccID, nome do COMEÇO de cliente, Balance
1020, John Smith, €-128.00
1057, lingüeta de Mike, €5839,00

I têm alguns serviços funcionar sobre estas tabelas que olham para fazer tarefas diferentes no records.
John Smith estão no vermelho, mas um fio veio completamente para alguns fundos assim que os fundos da atualização do serviço estão indo adicionar €1000 em seu account.
In meu proc do stor eu quero adiciono um registro para os fundos adicionados a uma tabela e atualizar a tabela do cliente. Eu começo uma transação. Tão então eu faço um contrapeso seleto do cliente e começ €-128.  Eu então crio o registro do fio na tabela de WireDetails e vou atualizar o contrapeso no accounts.

How faço mim paro um outro serivice que entra e fazer muda à tabela do cliente, como eu somente selecionei de it.

Sorry para o exemplo parvo mas eu espero que você vê o que é que I, m que tenta parar… o
thanks M
class= do

Resposta : Multi-threading e fileira travar sobre seleciona

Deixar-nos dizê-lo têm a tabela t (i int nao nulo, um carvão animal (1))
introduzir em t selecionam 1, “a”

rosquear as edições A1 isto:

começar a transação
AJUSTAR REPETÍVEL DO NÍVEL DA ISOLAÇÃO DA TRANSAÇÃO LIDO
selecionar * de t onde i=2


e então apenas senta-se lá. Vêm longitudinalmente a linha B e as edições

selecionar * de t onde i=2
atualizar o a='c ajustado de t onde i=2


O ø destas indicações do b sucederá, mas �a esperará até a linha A emitiu comete. Há um problema entretanto: é fácil ver que B pode facilmente cancelar a mudança feita por A, se actua de estabelecimento de bases em o que vê quando recuperou a fileira. Para essa razão, é melhor emitir

a='c ajustado da atualização t onde i=2 e a='a

Isto verific eficazmente que B está atualizando o que pensa que está atualizando. E isto é exatamente como o cursor cliente-baseado está funcionando, que é o tipo o mais usual do cursor usado em ferramentas de desenvolvimento de hoje, especialmente com suporte na internet: nenhuma transação, nenhum fechamento, mas durante a verificação da atualização de todos os campos que foram lidos, e eventualmente mudaram, a seguir mensagem de erro de maneira que um outro usuário modificou o resultset.

Se você quer eliminar este, a seguir você tem que emitir o nível ainda mais restritivo SERIALIZABLE da isolação da transação na linha B, e assim que você ler as fileiras em A, atualiza-as lá usando alguma coluna dummy apenas com esta finalidade. Então B não poderá ver as fileiras que podem ser modificadas por A - que está correto, porque de outra maneira B não saberia que estas fileiras estão sendo trabalhadas agora sobre pelo A. Mas isto naturalmente traz na introdução de A que deixa de funcionar, saindo para o almoço, etc., etc.

Para essa razão, o cursor cliente-localizado é provavelmente a maneira a mais prática de fazer todo o isto, que é porque é o tipo o mais difundido de operações da base de dados hoje.
Outras soluções  
 
programming4us programming4us