Bloqueio de acesso duplicado a dados do banco

Bom dia galera do guj!

Meu problema é o seguinte:

preciso bloquiar o acesso simultaneo de dados no banco sql. Quando o usuario 1 estiver lendo os dados da linha X, o usuario 2 nao pode acessar esses dados enquanto o usuario 1 nao liberar esses dados.

Dando uma pesquisada no google, encontrei algo sobre um bloqueio feito pelo InnoDB, mas não consegui utiliza-lo…

Alguem poderia me dar uma luz??

Obrigado!!

Não estou muito lembrado mas existe algo do tipo Commit que ajuda a prevenir que um dado tenha conflito ao ser manipulado por duas pessoas ao mesmo tempo.

Tenta pesquisar esse tal de commit.

Vc vai precisar dar um lock no registro. Normalmente esta técnica é usada quando alguém esta editando um registro e não lendo.

Commit não tem nada haver com o seu problema.

Bom dia.

Lucas, o acesso é a uma linha especifica ou ao próprio SGBD?
Digo, pois, se for bloquear o acesso a qualquer linha simultaneamente, podes usar o synchronized.

Abraços.

Edit: demorei tanto pra escrever que nao vi as duas ultimas respostas xD

Caro Giulliano, achu que me expressei mal mesmo! É exatamente isso que tenhu que fazer… bloquear o acesso quando um usuario esteja editando um dado… eu dei uma lida sobre esse lock, mas nao consegui usa-lo…

encontrei sites dizendo que eu deveria criar a tabela com o tipo InnoDB e utilizar um comando do tipo : Select * from tabela for update

mas esse comando nao funciona do mysql…

Caro nel,

seria bloquear o acesso a uma linha espefica que esta sendo lida… apenas se ela ja estiver sendo editada… cheguei a ver algo sobre bloqueio de registros… mas nao consegui absorve nada tbm… =/

De uma olhada em níveis de isolamento em banco de dados de uma olhada neste site http://msdn.microsoft.com/pt-br/library/ms189122.aspx ou http://pgdocptbr.sourceforge.net/pg80/transaction-iso.html

Cara eu não sei muito bem mais da uma olhada em transaction… vc pode controlar isso …
quando alguem está lendo uma tabela ngm mais pode ter acesso a ela enquanto a transação não for encerrada.
vc vai configurando sua transaction como vc quer…

Duas perguntinha que nao consegui achar pelas pesquisas no google:

  • Esse transction vale para select’s tbm ou so para insert??

  • a configuração do transiction seria antes ou depois do start? [ pra falar a verdade tentei antes e depois e nehum jeito deu certo =/ ]

cara foi mal eu me confundiii vc não usa o transaction …
o transaction ele vai garantir que seja feio um commit se der tudo certo se não ele faz um roll back…
Você pode da um LOCK na tabela e depois que terminar seu select vc libera ela ,agora não é muito agradavél fazer isso não !!

Caso decida utilizar o “for update” tome muito cuidado, pois se você se descuidar você pode bloquear todo seu BD… como diz um amigo meu que é DBA -“O FOR UPDATE é persona non grata”

Mas com o transaction não daria certo nao?

Tava pesquisando aqui, e parece que se eu usar o isolation level como read committed funcionaria direitin…

Mas nao deu pra testar, pq a versao do sql que tenhu aki e inferior à 4.0.5… =/

No caso, amigo, eu nao poderia dar um lock na tabela… a tabela nao pode ser travada… eu teria que travar apenas o indice… so nao sei se é possivel utilizar um lock pra travar um indice…

vou pesquisar…

com o transaction não cara … pq ele so vai garantir a integridade de seus dados no banco … se por algum motivo der merda la na sua operação
ela vai fazer o roll back…