none
Sequence RRS feed

  • Pergunta

  • Olá,

    eu preciso simular sequence no database em que estou trabalhando, e pesquisando, várias soluções utilizam ROW LEVEL LOCKING para evitar conflito.

    Como utilizar o row level locking, é por configuração ou na  instrução SQL?

    Obrigado.

    terça-feira, 19 de fevereiro de 2013 01:20

Respostas

  • Thiago, Bom dia!

    São coisas distintas, quando falamos de sequence estamos falando de informações sequenciais que podem ser utilizadas em N tabelas, o objeto sequence só esta disponivel a partir do SQL Server 2012, até o SQL Server 2008R2 temos a possibilidade de utilização de um campo IDENTITY por tabela, o problema deste é que ele não seria compartilhado entre quais tabelas voce quer e poderia gerar conflito, a solução para tal então é a criação de uma tabela de controle por ID e voce fazer uma programação (Uma proc por exemplo, ou função) que faça um select nesta tabela, agrege +1 e o utilize como sequence mas voce dever-a gerenciar esta informação.

    Ja ROW LEVEL LOCKING é a maneira de acesso do SQL Server a pagina de dados, pense na seguinte situação, voce tem uma tabela com 1 milhão de registros e fez o update em uma linha apenas, em um lock a nivel de linha um select na mesma trara todas as linhas menos esta que foi atualizada (Dado N variações ta, como isolation level entre outros), ja um page lock o select não conseguira ver nenhuma linha daquela pagina de dados aonde houve uma alteração (Ainda que em apenas uma linha!), ja em table lock a tabela inteira estara indisponivel.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 19 de fevereiro de 2013 12:08
    Moderador
  • Thiago,

    É realmente mais complexo, todo caso voce deve seguir regras:

     - A primeira coisa que que se fazer é buscar este valor dentro de uma transação e atualiza-lo para o proximo, caso este não seja realmente utilizado, paciencia, perdeu-se um valor (Coisa que tambem aconteceria na sequence).

     - Como organização eu criaria uma procedure para este processo.

     - Cuidado com Locks, apesar de que a utilização desta tabela é rapida, mas caso o processo esteja contigo em uma transação com N outras ações que demoram, voce terá lock, monitore-os.

     - Utilize o NoLock, não é uma boa recomendação sua utilização mas neste caso faz-se necessario.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 19 de fevereiro de 2013 14:10
    Moderador

Todas as Respostas

  • Thiago, Bom dia!

    São coisas distintas, quando falamos de sequence estamos falando de informações sequenciais que podem ser utilizadas em N tabelas, o objeto sequence só esta disponivel a partir do SQL Server 2012, até o SQL Server 2008R2 temos a possibilidade de utilização de um campo IDENTITY por tabela, o problema deste é que ele não seria compartilhado entre quais tabelas voce quer e poderia gerar conflito, a solução para tal então é a criação de uma tabela de controle por ID e voce fazer uma programação (Uma proc por exemplo, ou função) que faça um select nesta tabela, agrege +1 e o utilize como sequence mas voce dever-a gerenciar esta informação.

    Ja ROW LEVEL LOCKING é a maneira de acesso do SQL Server a pagina de dados, pense na seguinte situação, voce tem uma tabela com 1 milhão de registros e fez o update em uma linha apenas, em um lock a nivel de linha um select na mesma trara todas as linhas menos esta que foi atualizada (Dado N variações ta, como isolation level entre outros), ja um page lock o select não conseguira ver nenhuma linha daquela pagina de dados aonde houve uma alteração (Ainda que em apenas uma linha!), ja em table lock a tabela inteira estara indisponivel.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 19 de fevereiro de 2013 12:08
    Moderador
  • Bom Dia,

    Obrigado pela resposta.

    em relação a simulação de uma sequence, esta solução que você descreveu é a que eu iria seguir, pelo menos é a mais sugerida pesquisando sobre esta situação. Mas como controlar a concorrência desta informação, quando duas chamadas da procedure forem executadas simultaneamente?

    terça-feira, 19 de fevereiro de 2013 14:04
  • Thiago,

    É realmente mais complexo, todo caso voce deve seguir regras:

     - A primeira coisa que que se fazer é buscar este valor dentro de uma transação e atualiza-lo para o proximo, caso este não seja realmente utilizado, paciencia, perdeu-se um valor (Coisa que tambem aconteceria na sequence).

     - Como organização eu criaria uma procedure para este processo.

     - Cuidado com Locks, apesar de que a utilização desta tabela é rapida, mas caso o processo esteja contigo em uma transação com N outras ações que demoram, voce terá lock, monitore-os.

     - Utilize o NoLock, não é uma boa recomendação sua utilização mas neste caso faz-se necessario.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    terça-feira, 19 de fevereiro de 2013 14:10
    Moderador