Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 46 do total)
  • Autor
    Posts
  • #94782
    Maths
    Participante

      Galera, 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

      #94785
      vieri
      Participante

        select linha from tabela where linha = 100
        for update nowait ;

        #94786
        Maths
        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

          #94787
          vieri
          Participante

            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.

            #94788
            vieri
            Participante

              linha é um nome fictício para coluna,
              assim como tabela.

              #94789
              Maths
              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?

                #94792
                Maths
                Participante

                  Cara.. 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?

                  #94793
                  vieri
                  Participante

                    Você executou o update da mesma sessão no SQL DEVELOPER?

                    #94794
                    Maths
                    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??

                      #94796
                      vieri
                      Participante

                        Mas isso era esperado, para validar o bloqueio vc tem que usar outra sesão!! sem fechar a atual.. captou?

                        #94797
                        Maths
                        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??

                          #94798
                          burga
                          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…

                            #94799
                            Maths
                            Participante

                              Fudeu 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.

                              #94800
                              vieri
                              Participante

                                De 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

                                #94801
                                vieri
                                Participante

                                  apó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”!!!

                                Visualizando 15 posts - 1 até 15 (de 46 do total)
                                • Você deve fazer login para responder a este tópico.