- Este tópico contém 45 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 5 meses atrás por
Maths.
-
AutorPosts
-
24 de junho de 2010 às 5:06 pm #94782
Maths
ParticipanteGalera, queria saber se existe alguma maneira de LOCKAR alguma linha.. na tabela, nao o comando Lock Table, pois este locka a tabela.. digo Lock na linha.. para a query ou a função nao passar por ela ou elas!
Por exemplo, vamos supor q eu tenho 1 tabela, e eu trave uma ou algumas linhas, se eu dou um select na tabela inteira, o que acontece com as linhas que eu travei?? O select me retorna elas?? Queria saber o comando disso! Ou como travar elas tambem porem para nao serem alteradas, exemplo, a linha 6, 873, 76 travar para que nao sejam manipuladas em procedures ou em outras aplicaçoes entenderam??
Outro exemplo.. meu chefe quer fazer um teste, pegar uma tabela existente aqui e criar uma mesma tabela dessa tabela, porem quando ele criar essa tabela ele quer que as linhas que ele bloqueou nao venham, entendem? Ou seja, travar completamente as linhas para a coleta, ou selects, ou updates, deletes, tanto faz, contando que elas fiquem inacessiveis, uma ou varias linhas, a sintaxe disso x__x
24 de junho de 2010 às 7:26 pm #94785vieri
Participanteselect linha from tabela where linha = 100
for update nowait ;24 de junho de 2010 às 7:30 pm #94786Maths
Participante[quote=”vieri”:12bzexgp]select linha from tabela where linha = 100
for update nowait ;[/quote]O que exatamente essa query vai me fazer??
EU peguei a tabela aqui para testar, tenho que inserir a query e apos inserir essa query ele vai me bloquiar as linhas, ai depois eu testo fazendo um select da tabela certo??
Outra coisa, no select, nao entendi LINHA, como assim linhas no select? oO
24 de junho de 2010 às 7:49 pm #94787vieri
ParticipanteVocê irá escrever um select normal como qualquer outro,
com as sentenças nas claúsula where que irá definir
as linhas a serem bloqueadas.
O result set da consulta irá ser, as linhas que serão bloqueadas.
Você terá que incluir a claúsula FOR UPDATE NOWAIT.Após isso, vc faz oque quiser, as linhas estarão bloqueadas para DML.
Ou seja ele irá “reter”, as linhas para serem alteradas apenas na sua sessão, após um commit ou rollback na sua sessão as mesmas serão liberadas.
24 de junho de 2010 às 7:50 pm #94788vieri
Participantelinha é um nome fictício para coluna,
assim como tabela.24 de junho de 2010 às 7:57 pm #94789Maths
Participante[quote=”vieri”:20fs7exu]Você irá escrever um select normal como qualquer outro,
com as sentenças nas claúsula where que irá definir
as linhas a serem bloqueadas.
O result set da consulta irá ser, as linhas que serão bloqueadas.
Você terá que incluir a claúsula FOR UPDATE NOWAIT.Após isso, vc faz oque quiser, as linhas estarão bloqueadas para DML.
Ou seja ele irá “reter”, as linhas para serem alteradas apenas na sua sessão, após um commit ou rollback na sua sessão as mesmas serão liberadas.[/quote]
Acho que entendi.. seria isso entao?
Select * from tabela
where ID = 1 and 2 and 3
for update nowait;Ou seja, todas as colunas(*) das linhas com ID 1,2 E 3 serão bloqueadas.?? Outra coisa, existe maneira de bloquear sem ser por comando e sem ser por seção, q elas fiquem efetivamente bloqueadas até que eu desbloquiei novamente?
24 de junho de 2010 às 9:14 pm #94792Maths
ParticipanteCara.. nao funfou =/
Olha o q eu fiz, abri o SQL DEVELOPER, conectei ao banco..
select *
from dfl.wsf_ds_5620_c
where identificador_psys = ‘RCCF0111-1-152390619’
for update nowait;(identificador é a chave primaria)
Executei a query e ele me trouxe apenas essa linha como resultado..
Após isso fui e executei isso aqui para teste.
update dfl.wsf_ds_5620_c
set descricao = ‘PORRA’
where identificador_psys = ‘RCCF0111-1-152390619’Dei um update na msm tabela q restringi a linha e na mesma linha, o certo era ele nao deixa eu atualizar pois eu bloquiei a linha do update.. e adivinha.. olha o que ele me retornou:
1 rows updated
E agora?
24 de junho de 2010 às 9:22 pm #94793vieri
ParticipanteVocê executou o update da mesma sessão no SQL DEVELOPER?
24 de junho de 2010 às 9:29 pm #94794Maths
Participante[quote=”vieri”:3uhk1qnb]Você executou o update da mesma sessão no SQL DEVELOPER?[/quote]
Sim.. eu fiz a query do select e executei, 5 segundos depois eu apaguei a query que estava escrito e coloquei a query do update, e executei tambem, entendeu??
24 de junho de 2010 às 9:55 pm #94796vieri
ParticipanteMas isso era esperado, para validar o bloqueio vc tem que usar outra sesão!! sem fechar a atual.. captou?
24 de junho de 2010 às 10:03 pm #94797Maths
Participante[quote=”vieri”:3qfc88fc]Mas isso era esperado, para validar o bloqueio vc tem que usar outra sesão!! sem fechar a atual.. captou?[/quote]
Nao muito bem, estou usando a minha sessão, to como o DBA do banco, voce diz, alguem ou eu mesmo abrir outro sqldeveloper logar como usuario e tentar atualizar a linha, e nao posso fechar a minha seção senao a linha é desbloqueada novamente??
24 de junho de 2010 às 10:19 pm #94798burga
Participante[quote=”Maths”:b1at2esa][quote=”vieri”:b1at2esa]Mas isso era esperado, para validar o bloqueio vc tem que usar outra sesão!! sem fechar a atual.. captou?[/quote]
Nao muito bem, estou usando a minha sessão, to como o DBA do banco, voce diz, alguem ou eu mesmo abrir outro sqldeveloper logar como usuario e tentar atualizar a linha, e nao posso fechar a minha seção senao a linha é desbloqueada novamente??[/quote]
Exato…
24 de junho de 2010 às 10:25 pm #94799Maths
ParticipanteFudeu entao galera, nao é isso q eu preciso =(
Vou tentar resumir, eu queria apenas uma sintaxe, uma query q eu execute por sql plus, ou pl/sql developer, ou sql developer que eu BLOQUEIE as linhas q eu indicar, tenho a TABELA A, nela tem 100 registros, na linha 4, e na linhas 8 eu queria bloquear por exemplo.. ai eu faria o bloqueio e fechava a seção, algo que FICASSE COMITADO LA NO BANCO compreendem? eu pudesse fechar a seção ou a aplicação e a linha ficasse travada lá, ai eu abrisse uma nova seção, ou fazer o que eu faço(SLM) uma ferramenta q pega a tabela do banco e puxa para a aplicação para eu fazer fluxo dos dados, quando minha aplicação puxar a tabela ela deveria vir com as 2 linhas bloqueada pois eu bloquiei antes pela sintaxe diretamente no banco, e quando eu fizesse o fluxo, exemplo, um select dentro da aplicação ele me trouxesse 98 linhas, POIS aquelas 2 eu travei, entenderam?? mas um bloqueio para TUDO! SELECT, INSERT, DELETE E UPDATE, pois minha ferramenta (Service Flow) consegue manipular a tabela, mas queria que fosse bloqueada as linhas x__x, mas nao a 4 e 8, pode ser 30 linhas, ou 1 linha especifica, pois aqui queremos fazer simulaçoes com tabelas entendem? preciso de alguma forma, bloquear para as querys e aplicaçoes nao manipulares as linhas q eu indiquei.
24 de junho de 2010 às 10:35 pm #94800vieri
ParticipanteDe início, desconheço algo que bloqueie as linhas , até mesmo depois da sessão ser desconectada e por ai fique, o PMON avisa ao gerênciador de bloqueios que a sessão foi desconectada e o mesmo elimina o bloqueio.
É um funcionamento interno.Acho que vc tem que ver algo de auditoria, triggers,procedure,
vai ter que criar esse mecanismo. Se o cara alterar X linhas executa uma trigger que ativa a auditoria ou executa uma procedure que escreva uma tabela que as linhas XPTO estão bloqueadas e o worflow verificasse essa tabela antes de fazer select e dml.Sinceramente… não sei se isso funciona….
nosso amigos do GPO podem ter mas idéias… não estou muito criativo hoje..
ps: Vou tomar um café… rsrs
24 de junho de 2010 às 10:38 pm #94801vieri
Participanteapós um café… rsrs
Pesquise na documentação oque vc pode fazer com a DBMS_LOCK.
existe uma procedure DBMS_LOCK.SLEEP(‘segundo’);
que faz com que os registros fiquem bloqeuados por determinado tempo.
Acho que vc pode brincar com isso ai também, para tentar criar esse “carnaval”!!!
-
AutorPosts
- Você deve fazer login para responder a este tópico.