Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Determine o nível de isolamento efetivo no DB2 para Linux, UNIX e Windows

Já perguntaram a você qual nível de isolamento é usado?

Peter Schurr, IT Specialist DB2, IBM
Author Photo: Peter Schurr
Peter Schurr trabalha como IT Services Specialist para o IBM Software Group. Sua área de conhecimento é a administração e desenvolvimento de aplicativos para DB2 em plataformas distribuídas. Ele tem 12 anos de experiência com DB2 e é DBA Avançado Certificado IBM e Desenvolvedor de Aplicativo Certificado IBM. As áreas de especialização de Peter são ajuste de desempenho, replicação, federação e modelagem de dados.

Resumo:  Frequentemente perguntam a administradores de bancos de dados sobre o nível de isolamento de uma instrução. Mas há diferentes níveis nos quais é possível definir um nível de isolamento, e há diferentes métodos para recuperar o nível de isolamento efetivo. Conhecer esses métodos permite analisar problemas de simultaneidade ou de bloqueio com maior eficiência. Este artigo descreve o significado do nível de isolamento efetivo no IBM DB2® para Linux®, UNIX® e Windows®. Este artigo também mostra como determinar o nível de isolamento efetivo para instruções SQL dinâmicas e estáticas.

Data:  09/Ago/2011
Nível:  Intermediário Também disponível em :   Inglês
Atividade:  877 visualizações
Comentários:  


Introdução

Quando um problema de simultaneidade ou de bloqueio ocorre em um banco de dados, podem perguntar a você qual o nível de isolamento que uma instrução usa efetivamente. É possível identificar o nível de isolamento usando a opção -dynamic no utilitário db2pd, que está incluído no DB2 Versão 8. Mas qual é o nível de isolamento efetivo? Por exemplo, seria possível definir estabilidade de leitura (RS) no nível de isolamento de conexão, mas a cláusula WITH UR está sendo usada na própria instrução. A RS será mais forte, ou a cláusula de instrução pode sobrescrever a propriedade da conexão? Este artigo demonstra que o nível de instrução vence como nível de isolamento efetivo. Este artigo também descreve como monitorar o nível de isolamento efetivo.

Entendendo níveis de isolamento

Os níveis de isolamento ANSI são definidos para controlar o comportamento de transações simultâneas. Os níveis de isolamento têm efeitos diferentes. No DB2, isso é feito criando-se diferentes tipos de bloqueio no tempo de execução. A Tabela 1 mostra os fenômenos associados com os vários níveis de isolamento.


Tablela 1. Níveis e fenômenos de isolamento do DB2
Nível de isolamento ANSINível de isolamento do DB2Leituras sujasLeituras não repetidasLeituras fantasma
SerializávelRR (leitura repetida)NãoNãoNão
Leitura repetidaRS (estabilidade de leitura)NãoNãoSim
Leitura confirmadaCS (estabilidade do cursor)NãoSimSim
Leitura não confirmadaUR (leitura não confirmada)SimSimSim

Um nível de isolamento determina como os dados são bloqueados ou isolados de outros processos enquanto os dados estão sendo acessados. A seguir, detalhes sobre os diferentes níveis de isolamento:

  • UR: Permite que um aplicativo acesse mudanças não confirmadas de outras transações.
  • CS: Bloqueia qualquer linha acessada por uma transação de um aplicativo enquanto o cursor estiver posicionado na linha. Esse bloqueio permanece em vigor até que a próxima linha seja buscada ou que a transação seja finalizada.
  • RS: Bloqueia apenas aquelas linhas que um aplicativo recupera em uma unidade de trabalho. Isso assegura que qualquer linha qualificada lida durante uma unidade de trabalho não seja alterada por outros processos de aplicativo até que a unidade de trabalho seja concluída.
  • RR: Bloqueia todas as linhas que um aplicativo referencia em uma unidade de trabalho.

O exemplo a seguir explica os fenômenos. Dois aplicativos estão conectados a um banco de dados. O aplicativo 1 (A1) seleciona linhas de uma única tabela em um cursor. O aplicativo 2 (A2) altera linhas qualificadas na tabela e, mais tarde, confirma as mudanças. O aplicativo 1 reabre o cursor.

A seguir estão os resultados possíveis desse cenário.

  • Leituras sujas: A1 está recuperando dados não confirmados de A2
  • Leituras não repetidas: o cursor reaberto em A1 recupera atualizações de A2 em linhas qualificadas
  • Leituras fantasma: o cursor reaberto em A1 recupera inserções de A2 em linhas qualificadas

As explicações a seguir mostram como diferentes modos de bloqueio nos níveis de isolamento são usados para garantir os efeitos descritos. Mas lembre-se que há várias circunstâncias que influenciam o comportamento de bloqueio, incluindo o tamanho de uma lista de bloqueios, o nível de otimização, o método de acesso (varredura de tabela, varredura de índice ou varredura de índice de bloco) e a duração do bloqueio.

  • Ao usar UR no aplicativo A1 na seleção de diversas linhas, haverá um bloqueio IN (intent none) na tabela acessada. O aplicativo A2 insere uma nova linha qualificada. O aplicativo 2 pode estabelecer um bloqueio IX na tabela e um bloqueio de linha X, pois o bloqueio de tabela IX é compatível com o bloqueio IN de A1. Desde que A2 não confirme ou retroceda o inserto, o aplicativo A1 pode reabrir o cursor e recuperar a nova linha. Mas A2 pode, posteriormente, retroceder o inserto, e assim A1 não recuperou dados não confirmados.
  • Ao usar CS no aplicativo A1, haverá um bloqueio de tabela IS. Novamente, o aplicativo A2 insere uma nova linha qualificada. Mas A1 não pode reabrir o cursor antes que a inserção tenha sido confirmada sem causar uma situação de bloqueio e espera. Isso porque o novo bloqueio de linha X e o bloqueio de tabela IS não são compatíveis. Portanto, leituras não confirmadas não são possíveis com CS. Quando A2 confirma o inserto, como os modos de bloqueio de tabela IS e IX são compatíveis, o aplicativo A1 pode reabrir o cursor e recuperar a linha inserida. Portanto, leituras fantasma são possíveis com CS.
  • RR não permite leituras fantasmas, pois cria um bloqueio de tabela S (compartilhamento) ao selecionar linhas. Uma inserção cria um bloqueio de tabela IX, que não é compatível com um bloqueio S.

Observe que os níveis de isolamento ANSI e os níveis de isolamento do DB2 têm nomes diferentes, e "leitura repetida" tem diferentes significados. Os nomes dos níveis de isolamento ANSI também são usados no JDBC. Este artigo usa as abreviações típicas para os níveis de isolamento do DB2:

  • UR é leitura não confirmada
  • CS é estabilidade do cursor
  • RS é estabilidade de leitura
  • RR é leitura repetida
  • NC é sem confirmação, e é suportado apenas para DB2 Connect.

Entendendo níveis de definição

Os níveis de definição dos níveis de isolamento em uma API são mostrados em Figura 1. É uma estrutura hierárquica, e cada nível interno subsequente sobrescreve o nível externo anterior.


Figura 1. Visão geral de níveis de definição

A seguir estão os níveis em detalhe:

  • O primeiro é o nível de driver, que é uma coleção de funções e métodos de driver. Esse nível de isolamento é definido quando o driver e suas bibliotecas são carregados.
  • O próximo é o nível de conexão. Sempre que um manipulador de conexões estiver sendo alocado, um nível de isolamento pode ser definido. Esse nível de isolamento é efetivo quando a conexão estiver aberta.
  • O próximo nível no DB2 é o nível de pacote. Ao usar SQL, um pacote é criado e pode ser ligado a um nível de isolamento específico. Esse nível de isolamento é quando o pacote é efetivamente descrito.
  • O último é o nível de instrução. Sempre que um manipulador de instrução for alocado, um nível de isolamento precisa ser definido. Esse nível é efetivo quando a instrução for executada.

É possível ter diversas instâncias em um nível específico. Com exceção do nível de pacote, em SQL dinâmico é possível ter diversas conexões (em diferentes aplicativos) e definir diferentes níveis de isolamento para cada conexão. Em cada conexão, é possível definir instruções que tenham diferentes níveis de isolamento, como mostram as Figura 2.


Figura 2. Instâncias de definição

Para SQL estático, é possível criar uma cópia de um módulo usando um nome diferente e ligá-lo a um nível de isolamento diferente para esse novo pacote.


Configurando o nível de isolamento

No DB2, o nível de isolamento é sempre definido no cliente. Não há um nível de isolamento padrão do banco de dados que possa ser definido no lado do servidor. Em vez disso, se um nível de isolamento não for definido explicitamente no cliente, o DB2 usa CS como padrão. DB2 Versão 8 introduziu a cláusula de instrução WITH ISOLEVEL, que pode ser usada para definir o nível de isolamento no nível de instrução. Nível de cliente e nível de ambiente são sinônimos para nível da conexão neste artigo.

Siga as etapas no exemplo abaixo para configurar o nível de isolamento nos níveis de conexão e de instrução para o aplicativo JDBC.

  1. Defina o nível de isolamento através da propriedade de conexão setTransactionIsolation no nível de conexão (sessão). Lista 1 mostra um exemplo em JDBC da configuração de UR.

    Lista 1. Propriedade de conexão JDBC
    
    Connection con = DriverManager.getConnection(this.aURL ,this.USER, this.PWD);
    con.setTransactionIsolation( Connection.TRANSACTION_READ_UNCOMMITTED )
    

  2. Defina o nível de isolamento no nível de instrução usando a cláusula WITH. Lista 2 mostra um exemplo de código Java® para usar UR.

    Lista 2. Cláusula de instrução
    
    sql= "SELECT mandantid, belegnr FROM "+this.SCHEMA+".beleg WHERE cat = ?  WITH UR" 
    PreparedStatement pstmt1 = con.prepareStatement(sql);
    

Tablela 2 descreve todos os métodos para definir o nível de isolamento em diferentes APIs.


Tablela 2. Definindo nível de isolamento de conexão
APINívelDescriçãoComando e exemplo
SQLDriverNa linha de comando do DB2 (db2cmd/shell) para a sessão atualdb2 "SET CURRENT ISOLATION isolevel
Por exemplo, db2 "SET CURRENT ISOLATION RS"
CLIConexãoEm aplicativos deConfigurando o atributo SQL_ATTR_TXN_ISOLATION
Driver JDBC tipo 4ConexãoAtravés do método setTransactionIsolation setTransactionIsolation(isolevel_constant)
Por exemplo, con.setTransactionIsolation( Connection.TRANSACTION_READ_UNCOMMITTED )
ODBCDriverPor configuração ODBCUsando a palavra-chave TXNISOLATION no arquivo db2cli.ini
Por exemplo, db2 "update cli cfg at user level for section TESTDB using TXNISOLATION 4"
SQLJPacotePara SQLJ pela opção de ligação de perfil SQLJdb2sqljbind -url jdbc:db2://host:port/db -bindoptions "ISOLATION isolevel" serialized-profile-name
Por exemplo, db2sqljbind -url jdbc:db2://localhost:50001/TESTDB -bindoptions "ISOLATION RS " $@_SJProfile0
SQL EstáticaPacoteEm SQL estática com uma opção de ligaçãodb2 "BIND bindfile ISOLATION isolevel"
Por exemplo, db2 "BIND client11.bnd ISOLATION RS"
Procedimentos SQLPacoteEm procedimentos SQL, por um parâmetro especial de registrodb2set DB2_SQLROUTINE_PREPOPTS="ISOLATION isolevel"
Por exemplo, db2set DB2_SQLROUTINE_PREPOPTS="ISOLATION UR"

Tablela 3 lista o nome do atributo e valores válidos para atributos de nível de isolamento em APIs usando constantes.


Tablela 3. Valores de atributo de nível de isolamento
CLIDriver JDBC tipo 4ODBC, SQL integrada, Cobol
AtributoTXNISOLATIONMétodo setTransactionIsolationSQL_ATTR_TXN_ISOLATION
UR1Connection.TRANSACTION_READ_UNCOMMITTEDSQL_TXN_READ_UNCOMMITTED
CS2Connection.TRANSACTION_READ_COMMITTED>SQL_TXN_READ_COMMITTED
RS4Connection.TRANSACTION_REPEATABLE_READSQL_TXN_REPEATABLE_READ
RR8Connection.TRANSACTION_SERIALIZABLESQL_TXN_SERIALIZABLE

Especialmente em aplicativos CLI, é possível definir facilmente três diferentes níveis:

Nível de driver
É possível catalogar diversas origens de dados ODBC, e é possível atualizar o parâmetro TXNISOLATION da configuração CLI de cada origem de dados separadamente.
Nível da conexão
É possível configurar o atributo SQL_ATTR_TXN_ISOLATION explicitamente para uma conexão.
Nível de instrução
Em cada instrução, é possível usar a cláusula WITH para definir um nível de isolamento de instrução.

O exemplo na Figura 3 mostra dois aliases do banco de dados diferentes: TESTDB e SECOND.


Figura 3. Exemplo de instâncias

Portanto, é possível atualizar a configuração CLI de cada origem de dados ODBC separadamente. Os aplicativos APPL1 e APPL2 estão conectados à origem de dados ODBC TESTDB, enquanto APPL3 conecta-se à origem de dados ODBC SECOND. O atributo SQL_ATTR_TXN_ISOLATION pode ser configurado de forma diferente (por exemplo, APPL1 isa 4 e APPL2 usa 2). Em cada aplicativo, é possível definir o nível de isolamento no nível de instrução usando a cláusula WITH.


Monitorando o nível de isolamento no DB2

Embora o nível de isolamento possa ser configurado em diferentes níveis, só pode haver um nível de isolamento efetivo. O último nível definido no nível de hierarquia é sempre o nível de isolamento efetivo. Em outras palavras, um nível de isolamento de instrução sobrescreve um nível de isolamento de pacote; um nível de isolamento de pacote sobrescreve um nível de isolamento de conexão; e um nível de isolamento de conexão sobrescreve um nível de isolamento de driver.

O exemplo a seguir compara níveis de conexão e instrução e mostra que o nível de instrução é sempre o efetivo.

O nível de isolamento pode ser monitorado usando qualquer um dos métodos descritos em Tablela 4. A coluna nível relatado mostra se a ferramenta recupera o nível de isolamento no nível de conexão ou no nível de instrução. Essa é a diferença mais importante.


Tablela 4. Ferramentas disponíveis
FerramentaNível relatadoPalavra-ChaveValores/CamposExemplo
Captura instantânea de SQL dinâmica (ou "db2pd -dyn").Nível de instruçãoTexto da instruçãoCláusula WITH isolevelWITH UR
Captura instantânea de aplicativoNível da conexãoNome do pacoteSYSSHxyySYSSH300 (3=RS)
Monitor de eventos para instruçõesNível da conexãoNome do pacoteSYSSHxyySYSSH300 (3=RS)
Cache dinâmico (db2pd -dyn)Nível da conexãoAmbientes de SQL dinâmicaStmtUID EnvID Iso11 1 RR
Nível de isolamento efetivo (db2pd -act)Nível de instruçãoLista de instrução de ação:StmtUID EffISO11 0
Funções e monitores de eventos do Workload Manager (WLM)Nível de instruçãoSTMT_ISOLATION0..41 (=UR)

Observe que a codificação dos níveis de isolamento nas ferramentas difere em relação a valores e intervalos da seguinte maneira:

  • Nomes de pacote estão no formato SYSSHxyy, SYSSNxyy, SYSLHxyy ou SYSLNxyy. x é o nível de isolamento. 0=NC, 1=UR, 2=CS, 3=RS e 4=RR.
  • O ambiente ou nível de sessão em db2pd -dynamic é relatado como UR, CS, RS e RR.
  • O nível de isolamento efetivo em db2pd -active e a função de tabela WLM_GET_ACTIVITY_DETAILS é 0=RR, 1=CS, 2=UR e 3=RS.
  • O nível de isolamento efetivo do elemento monitor de isolamento da instrução é 0=sem nível de isolamento especificado, 1=UR, 2=CS, 3=RS e 4=RR.

Tablela 5 resume a codificação dos níveis de isolamento em diferentes ferramentas. N/A significa que não é especificado, e NC significa No Commit, o que é suportado apenas para conexão a iSeries®. Pode-se ver que a codificação em EffIso de db2pd e em EFFECTIVE_ISOLATION de WLM_GET_ACTIVITY_DETAILS são os mais confusos. As outras codificações são previsíveis.


Tablela 5. Codificação do nível de isolamento
Ferramenta01234
Nome do pacoteNCURCSRSRR
db2pd EffIsoRRCSURRS-
EFFECTIVE_ISOLATION (WLM_GET_ACTIVITY_DETAILS)RRCSURRS-
STMT_ISOLATIONNENHUMURCSRSRR

A lista a seguir descreve o uso dessas ferramentas.

  • Verifique o texto da instrução na captura instantânea de SQL dinâmica para ver se há uma cláusula WITH no texto do campo Statement. Esse é um nível de isolamento de instrução. No exemplo, WITH UR é usado para configurar leitura não confirmada, como mostra a Lista 3.

    Lista 3. Captura instantânea de SQL dinâmica
    
    Comando:
    db2 get snapshot for dynamic sql on dbname 
    Exemplo: db2 get snapshot for dynamic sql on TESTDB Saída: Number of executions = 1 ... Statement text = SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ? WITH UR

  • Verifique se há um manipulador de aplicativos específico no nome do pacote em uma captura instantânea de aplicativo. Na seção de instrução, o nome do pacote contém um código para o nível de isolamento de conexão. No exemplo, o nome do pacote relata RS (o código 3), enquanto a instrução usa a cláusula WITH UR. O nome do pacote relata o nível de isolamento da conexão, como mostra Lista 4, mas esse não é o nível de isolamento efetivo.

    Lista 4. Captura instantânea de aplicativo
    
    Comando:
    db2 get snapshot for applications on dbname 
    Exemplo: db2 get snapshot for applications on TESTDB Saída: Application handle = 471 ... Statement type = Dynamic SQL Statement ... Package name = SYSSH300 ... Dynamic SQL statement text: SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat IN ( 1, 2 ) WITH UR

  • Verifique se há um manipulador de aplicativos específico no nome do pacote em um monitor de eventos. Na seção de instrução para qualquer operação, como PREPARE, o nome do pacote contém um código para o nível de isolamento de conexão. No exemplo, o nome do pacote relata RS (código 3), como mostra a Lista 5, que é o mesmo que a captura instantânea de aplicativo na Lista 4.

    Lista 5. Monitor de evento
    
    Comando:
    db2 CONNECT TO  dbname 
    db2 CREATE EVENT MONITOR eventmonitor for STATEMENTS WRITE TO FILE 'path' 
    db2evmon -db  dbname -evm  eventmonitor > file 
    Exemplo: db2 CONNECT TO TESTDB db2 CREATE EVENT MONITOR evmon01 FOR STATEMENTS WRITE TO FILE 'C:\db\data\event\' db2evmon -db TESTDB -evm evmon01 > evmon01.out Saída: Type : Dynamic Operation: Prepare Package : SYSSH300 ... Text : SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ? WITH UR

  • Ao recuperar o cache dinâmico por db2pd (usando a opção -dynamic) verifique se há uma instrução na seção do ambiente nas configurações. O texto da instrução é relatado na seção de instrução. O link entre essas seções pode ser estabelecido usando os identificadores AnchID e StmtUID. O ambiente relata o nível de isolamento da conexão (no exemplo é RR), enquanto a instrução usa a cláusula WITH UR, como mostra a Lista 6.

    Lista 6. Cache dinâmico
    
    Comando:
    db2pd -db dbname  -dynamic -file  file 
    Exemplo: db2pd -db TESTDB -dynamic -file db2pd_dyn.out Saída: ... Dynamic SQL Statements: AnchID StmtUID NumEnv Text 96 1 1 SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ? WITH UR ... Dynamic SQL Environments: AnchID StmtUID EnvID Iso QOpt Blk 96 1 1 RS 5 B

  • Para recuperar o nível de isolamento efetivo, execute db2pd usando a opção -active. Observe que esse é o único elemento de monitor no DB2 chamado effective isolation level. Verifique o valor de EffISO na seção Active Statement List. Ela relata o nível de isolamento de instrução. No exemplo, o nível de isolamento de instrução é 2, o que corresponde a UR, como mostra a Lista 7.

    Lista 7. Lista de instruções de ação
    
    Comando:
    db2pd -db TESTDB -active -file db2pd_act.out
    Saída:
    Active Statement List:
    AppHandl UOW-ID     StmtID     AnchID StmtUID    EffISO
    30       1          1          96     1          2           
    

  • É possível usar as funções e monitores de evento do Workload Manager (WLM), a partir do DB2 9.5. Após configurar um monitor de evento para atividades, é possível recuperar a coluna STMT_ISOLATION das tabelas de monitor de evento. A coluna relata o nível de isolamento de instrução. Primeiro é preciso criar o monitor de evento específico e alterar a classe de serviço padrão SYSDEFAULTSUBCLASS para coletar detalhes de atividade, como mostra a Lista 8.

    Lista 8. WLM
     
    CREATE TABLESPACE monitor IN DATABASE PARTITION GROUP IBMDEFAULTGROUP ;
    CREATE EVENT MONITOR WLM_EVENT FOR ACTIVITIES WRITE TO TABLE
    	ACTIVITY (TABLE WLM_EVENT IN MONITOR),
    	ACTIVITYSTMT (TABLE WLM_EVENT_STMT IN MONITOR) AUTOSTART;
    SET EVENT MONITOR WLM_EVENT STATE 1 ;
    ALTER SERVICE CLASS SYSDEFAULTSUBCLASS UNDER SYSDEFAULTUSERCLASS 
     COLLECT ACTIVITY DATA ON ALL DATABASE PARTITIONS WITH DETAILS
     COLLECT AGGREGATE ACTIVITY DATA EXTENDED
    

    Em seguida, é possível recuperar o valor de STMT_ISOLATION da tabela de monitor de evento como o nível de isolamento de instrução. No exemplo, o valor 1 é recuperado em STMT_ISOLATION, o que corresponde a UR, como mostra a Lista 9

    Lista 9. Seleção do WLM
       
    Comando:
    select STMT_ISOLATION  , STMT_FIRST_USE_TIME , substr(STMT_TEXT,1,100) AS TEXT
    from  DB2ADMIN.WLM_EVENT_STMT 
    Saída:
    STMT_ISOLATION       STMT_FIRST_USE_TIME        TEXT
    -------------------- -------------------------- --------------------------
                       1 2011-04-30-12.32.21.031475 SELECT mandantid, belegnr 
    FROM DB2ADMIN.beleg WHERE cat = ?  WITH UR
    

    Em vez de usar a classe de serviço padrão, é possível definir uma configuração WLM específica para capturar as instruções, tal como uma nova classe de serviço e carga de trabalho, que faz referência apenas a APPLNAME('db2jcc_application') para o aplicativo JDBC.

Configurando o ambiente de etapas de teste

Todas as etapas de teste são executadas no DB2 9.5, em um banco de dados chamado TESTDB. É criada uma enorme tabela, chamada BELEG, que contém diferentes intervalos na coluna CAT. Instruções selecionadas são executadas por cerca de 5 segundos para poderem verificar a ferramenta db2pdde instrução de ação.

O exemplo usa um aplicativo Java simples que é executado por JDBC tipo 4 contra o banco de dados local TESTDB. Atributos de tempo de execução são definidos em um arquivo de propriedades. Isso permite alterar o nível de isolamento nos níveis de conexão e instrução sem recompilar o código. Lista 10 mostra conteúdo de exemplo de Client01.properties. A propriedade ISOLEVEL define o nível de isolamento de conexão (no exemplo, RS). A propriedade STMTISOLEVEL define o nível de isolamento de instrução (no exemplo, UR).


Lista 10. Conteúdo de exemplo de arquivo de propriedades

DRIVER=com.ibm.db2.jcc.DB2Driver
URL=jdbc:db2:
SERVER=localhost
PORT=50001
ALIAS=TESTDB
USER=db2admin
PWD=ibmswg001
SCHEMA=DB2ADMIN
ISOLEVEL=RS
STMTISOLEVEL=UR

O aplicativo Java Client01.class precisa do nome de um arquivo de propriedades válido como argumento obrigatório, como mostra a Lista 11. A opção -a é para o modo silencioso, e busca todas as linhas sem solicitar.


Lista 11. Uso do aplicativo Java Client01.class

java Client01 Client01.properties -a

Explorando Etapas de Teste (1): RS no nível de conexão, UR no nível de instrução

Nestas etapas de teste, você definirá RS no nível de isolamento de conexão e UR no nível de isolamento de instrução (usando a cláusula WITH UR), como mostra a Lista 12. Você também irá recuperar UR como o nível de isolamento efetivo.


Lista 12. Conteúdo do arquivo de propriedades para nível de conexão e de instrução

ISOLEVEL=RS
STMTISOLEVEL=UR

Lista 13 mostra uma saída típica, que exibe configurações e retorna código dos comandos:


Lista 13. Executando Client01.class
DB295>java Client01 Client01.properties -a
Starting Client01

###INFO: Properties loaded from file Client01.properties
###INFO: Connection string= jdbc:db2://localhost:50001/TESTDB,db2admin,***
###INFO: EnterMode= Non Single Row.
###INFO: Connection level= RS
###INFO: Statement  level= UR
###INFO: Positioned Update= true
###INFO: Running...  SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ?  WITH UR
###INFO: Startdate= Sun May 01 12:23:04 CEST 2011

###INFO: Enddate= Sat Apr 30 12:32:26 CEST 2011
ResultSet Size = 49793

RESULT: Test ran successfully in 5687 ms.
Press ENTER ...
DB295>

A saída de db2pd -d TESTDB -active relata o valor 2, o que corresponde a UR.


Lista 14. db2pd -active output

Database Partition 0 -- Database TESTDB -- Active -- Up 1 days 00:52:02 
Active Statement List:
Address    AppHandlUOW-ID  StmtID     AnchID StmtUID    EffISO      EffLockTOut EffDegree
RefTime
0x79117F50 298      1      1          96     1          2           -1          0   

Verifique os bloqueios para validar o nível de isolamento efetivo, pois você pode ver diretamente a diferença nos modos de bloqueio. O bloqueio ativo é um bloqueio de tabela em BELEG com modo IN, que corresponde a UR, como mostra a Lista 15.


Lista 15. db2pd -db TESTDB -lock showlocks: modo de bloqueio como UR

Address    Type       Mode Sts Owner      Dur HoldCount  
0x7E1B0300 Table      .IN  G   9          2   2          TbspaceID 3     TableID 20

db2pd exibe o texto da instrução que contém a cláusula WITH UR. O nível de isolamento da conexão é RS, como você definiu no arquivo de propriedades, como mostra a Lista 16.


Lista 16. saída de db2pd -dynamic

Dynamic SQL Statements:
AnchID StmtUID    NumEnv     Text
96     1          SELECT mandantid, belegnr
    FROM DB2ADMIN.beleg WHERE cat = ?  WITH UR
Dynamic SQL Environments:
AnchID StmtUID    EnvID      Iso QOpt Blk
96     1          1          RS  5    B

A captura instantânea de aplicativo relata que o nível de isolamento de conexão é RS (3), mas também se pode ver o texto da instrução contendo a cláusula WITH UR, como mostra a Lista 17.


Lista 17. Captura instantânea de aplicativo

Statement type                             = Dynamic SQL Statement
Statement                                  = Fetch
...
Package name                        = SYSSH300
...
Dynamic SQL statement text:
SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ?  WITH UR

A saída do monitor de eventos de instrução formatada também relata, na operação PREPARE, que o nível de isolamento de conexão é RS (3), mas também se pode ver o texto da instrução contendo a cláusula WITH UR, como mostra a Lista 18.


Lista 18. Monitor de eventos de instrução

  Type     : Dynamic
  Operation: Prepare
  Section  : 1
  Creator  : NULLID  
  Package  : SYSSH300
  Consistency Token  : SYSLVL01
  Package Version ID  : 
  Cursor   : SQL_CURSH300C1
  Cursor was blocking: FALSE
  Text     : SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ?  WITH UR

A seleção na tabela de monitor de evento do Workload Manager para instruções recupera 1 para UR como o nível de isolamento de instrução, que também se pode identificar no texto de instrução, como mostra a Lista 19.


Lista 19. Conteúdo da tabela do monitor de eventos do WLM
   
select STMT_ISOLATION  , STMT_FIRST_USE_TIME , substr(STMT_TEXT,1,100) AS TEXT
from  DB2ADMIN.WLM_EVENT_STMT 
Saída:
STMT_ISOLATION       STMT_FIRST_USE_TIME        TEXT
-------------------- -------------------------- --------------------------
                   1 2011-04-30-12.32.21.031475 SELECT mandantid, belegnr 
FROM DB2ADMIN.beleg WHERE cat = ?  WITH UR

Conclusão das etapas de teste 1: o nível de isolamento efetivo relatado pelas ferramentas nesse caso é UR, que é o nível de isolamento de instrução.


Explorando Etapas de Teste (2): CS no nível de conexão, RS no nível de instrução

Nestas etapas de teste, você definirá CS no nível de isolamento de conexão e RS no nível de isolamento de instrução usando a cláusula WITH RS, como mostra a Lista 20. Você também irá recuperar RS como o nível de isolamento efetivo.


Lista 20. RS sobre CS

ISOLEVEL=CS
STMTISOLEVEL=RS

A saída de db2pd -d TESTDB -active relata o valor 3, que corresponde a RS, como mostra a Lista 21.


Lista 21. db2pd -active output

Database Partition 0 -- Database TESTDB -- Active -- Up 1 days 01:11:30
Active Statement List:
Address    AppHandlUOW-ID  StmtID     AnchID StmtUID    EffISO      EffLockTOut EffDegree
RefTime
0x79118280 312      1      1          201     1          3           -1          0   

db2pd exibe o texto da instrução que contém a cláusula WITH RS. O nível de isolamento da conexão é CS, como definido no arquivo de propriedades, como mostra a Lista 22.


Lista 22. saída de db2pd -dynamic

Dynamic SQL Statements:
AnchID StmtUID    NumEnv     Text
201    1          1          SELECT mandantid, belegnr
    FROM DB2ADMIN.beleg WHERE cat = ?  WITH RS
Dynamic SQL Environments:
AnchID StmtUID    EnvID      Iso QOpt Blk
201    1          1          CS  5    B

A saída do monitor de eventos de instrução formatada também relata que o nível de isolamento de conexão é CS (2), mas também se pode ver o texto da instrução contendo a cláusula WITH RS, como mostra a Lista 23.


Lista 23. Monitor de eventos de instrução

  Type     : Dynamic
  Operation: Prepare
  Section  : 1
  Creator  : NULLID  
  Package  : SYSSH200
  Consistency Token  : SYSLVL01
  Package Version ID  : 
  Cursor   : SQL_CURSH200C1
  Cursor was blocking: FALSE
  Text     : SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ?  WITH RS

A seleção na tabela de monitor de eventos do Workload Manager para instruções recupera 3 para RS como o nível de isolamento de instrução, que também se pode identificar no texto de instrução, como mostra a Lista 24.


Lista 24. Conteúdo da tabela do monitor de eventos do WLM
   
select STMT_ISOLATION  , STMT_FIRST_USE_TIME , substr(STMT_TEXT,1,100) AS TEXT
from  DB2ADMIN.WLM_EVENT_STMT 
Saída:
STMT_ISOLATION       STMT_FIRST_USE_TIME        TEXT
-------------------- -------------------------- --------------------------
                   3 2011-04-30-12.34.21.066473 SELECT mandantid, belegnr 
FROM DB2ADMIN.beleg WHERE cat = ?  WITH RS

Conclusão das etapas de teste 2: o nível de isolamento efetivo relatado pelas ferramentas nesse caso é RS, que é o nível de isolamento de instrução.


Monitorando SQL estática

No DB2, SQL estática é suportada e resulta na criação de pacotes. Pacotes têm várias opções de ligação, uma das quais é no nível de isolamento. Após um pacote ser criado, o nível de isolamento não pode ser alterado sem recompilar. SQL estática é usada em SQL integrada, Java SQLJ e ao criar procedimentos SQL.

Verifique as ferramentas na SQL estática criando um aplicativo SQLJ Java. O nome do pacote é ClientS1. Defina RS para o pacote. O nível de isolamento do pacote pode ser recuperado do catálogo, como mostra a Lista 25.


Lista 25. Pacote ClientS1 de nível de isolamento

SELECT isolation FROM syscat.packages WHERE pkgname = 'ClientS1'
ISOLATION
---------
RS       

O código contém essa instrução usando UR como o nível de isolamento de instrução, como mostra a Lista 26.


Lista 26. Código SQLJ SQL

#sql cs1 = { SELECT mandantid FROM db2admin.beleg WHERE cat = 1 WITH UR }; 

Para exibir o nível de isolamento de pacotes, a opção -static do db2pd é útil. Ela mostra RS como o nível de isolamento de pacote, como mostra a Lista 27.


Lista 27. Saída db2pd -static

Packages:
Schema   PkgName  NumSec UseCount   NumRef     Iso QOpt  Blk 
DB2ADMIN ClientS1 1      0          1          RS  5     B   

A opção -active do db2pd não ajuda realmente ao usar SQL estática, pois o identificador da instrução é sempre 0. Em vez disso, use o monitoramento WLM. A seleção na tabela de monitor de evento do Workload Manager para instruções recupera 1 para UR como o nível de isolamento de instrução, que também se pode identificar no texto de instrução, como mostra a Lista 28. Observe que a instrução é relatada como uma definição de cursor, pois é a seção de um pacote.


Lista 28. Conteúdo da tabela do monitor de eventos do WLM
   
select STMT_ISOLATION  , substr(STMT_TEXT,1,100) AS TEXT
from  DB2ADMIN.WLM_EVENT_STMT 
Saída:
STMT_ISOLATION       TEXT
-------------------- --------------------------
                   1 DECLARE DB2JCCCURSOR1 CURSOR FOR SELECT mandantid 
  FROM db2admin.beleg WHERE cat = 1 WITH UR

Conclusão do exemplo de SQL estática: o nível de isolamento efetivo relatado pelas ferramentas é UR, que é o nível de isolamento de instrução.


Explorando conceitos adicionais

  • Ao executar a mesma instrução com diferentes níveis de isolamento de conexão em sequência, db2pd -dynamic relata diferentes environment identifiers (EnvID) para essa instrução (fazendo referência aos diferentes níveis de isolamento de conexão). No exemplo, RS e RR são usados como o nível de isolamento de conexão. A coluna AnchID é 127, mas pode-se ver duas entradas de ambiente para esse ID, como mostra a Lista 29.

    Lista 29. saída de db2pd -dynamic ao usar diferentes níveis de isolamento de conexão
    
    Dynamic SQL Statements:
    AnchID StmtUID    NumEnv     NumExe Text 
    127    1          2               2          SELECT mandantid, belegnr
        FROM DB2ADMIN.beleg WHERE cat = ?
    Dynamic SQL Environments:
    AnchID StmtUID    EnvID      Iso QOpt Blk
    127    1          2          RR  5    B
    127    1          1          RS  5    B
    

  • Ao executar diversos aplicativos em paralelo com exatamente o mesmo texto de instrução, db2pd -dynamic relata uma única instrução e um único ambiente. Mas a coluna NumExe é aumentada, à medida que aumenta o número de execuções da instrução. No exemplo, chame a instrução três vezes, como mostra a Lista 30.

    Lista 30. saída de db2pd -dynamic na mesma instrução
    
    Dynamic SQL Statements:
    AnchID StmtUID    NumEnv     NumVar  NumRef   NumExe Text 
    96    1          1          1       1        3      SELECT mandantid, belegnr
        FROM DB2ADMIN.beleg WHERE cat = ?  WITH RS
    Dynamic SQL Environments:
    AnchID StmtUID    EnvID      Iso QOpt Blk
    96     1          2           CS  5    B
    

  • Ao executar diversos aplicativos em paralelo usando níveis de isolamento de instrução diferentes, db2pd -dynamic relata diferentes identificadores de instrução (AnchID). O texto da instrução difere porque a cláusula WITH é parte do texto SQL, como mostra a Lista 31.

    Lista 31. saída de db2pd -dynamic em diferentes níveis de isolamento de instrução
    
    Dynamic SQL Statements:
    AnchID StmtUID    NumEnv     NumVar  NumRef   NumExe Text 
    96     1          1          1          1          1 SELECT mandantid, belegnr
        FROM DB2ADMIN.beleg WHERE cat = ?   WITH UR  
    201 1 1 1 1 1 SELECT mandantid, belegnr FROM DB2ADMIN.beleg WHERE cat = ? WITH RS Dynamic SQL Environments: AnchID StmtUID EnvID Iso QOpt Blk 96 1 1 CS 5 B 201 1 1 CS 5 B

  • Se você usar diferentes níveis de isolamento de instrução em uma única transação, não há efeito. A instrução funciona como descrito aqui; cada nível de isolamento de instrução é o efetivo.
  • Em vez de monitorar os níveis de isolamento usando as ferramentas descritas neste artigo, é possível usar recursos de rastreio para verificar as configurações. Por exemplo, em um aplicativo CLI, é possível ativar um rastreio de CLI. Lá você verá os valores de TXNISOLATION e SQL_ATTR_TXN_ISOLATION, se usado. Lista 32 mostra saída de rastreio de exemplo, na qual o driver e os níveis de isolamento de conexão são definidos. Para .NET é possível ativar um rastreio .NET, e para JDBC é possível ativar um rastreio JCC para capturar detalhes de metadados nos rastreios.

    Lista 32. Conteúdo do rastreio CLI do aplicativo CLI
    
    SQLConnect( )
        <--- SQL_SUCCESS
    ( DSN=""TESTDB"" )
    ( UID=""db2admin"" )
    ( PWD="" )
    ( DBALIAS="TESTDB" )
    ( TXNISOLATION="1" )
    SQLSetConnectAttr( hDbc=0:1, fOption=SQL_ATTR_TXN_ISOLATION, pvParam=&00000004)
     

    Lista 33 mostra um exemplo de traço jcc.

    Lista 33. Conteúdo do rastreio jcc a partir do aplicativo Java
    [jcc] Default isolation: 2
    ...
    [jcc][Time:...][Thread:main][Connection@1ae81ae8] setTransactionIsolation (4) called
    


Conclusão

Este artigo ilustrou os seguintes conceitos principais:

  • Transações curtas não podem ser capturadas pela ferramenta db2pd -active, portanto, isso só é útil para transações de longo período.
  • db2pd -dynamic sempre relata o nível de isolamento de conexão, e não o efetivo. db2pd -static para SQL estática exibe o nível de isolamento do pacote (a opção de ligação do pacote).
  • O monitor de eventos do WLM é sempre um método apropriado.
  • Em resumo, métodos válidos para recuperar os níveis de isolamento efetivos incluem:
    • db2pd -dynamic sempre relata o nível de isolamento de conexão.
    • db2pd -active pode ser usado para capturar o nível de isolamento efetivo para instruções e transações de longa duração.
    • O uso de funções ou monitor de eventos do Workload Manager (WLM) é possível para transações curtas e para ter um histórico completo de atividades. Sempre reporta o nível de isolamento efetivo.

Ao comparar o nível de isolamento da conexão e o nível de isolamento de instrução (que são os níveis mais usados), o artigo explica que o nível de isolamento de instrução é o nível de isolamento efetivo. Geralmente o nível de isolamento efetivo é o nível de isolamento usado no tempo de execução. As regras básicas são:

  • O nível de isolamento é sempre definido no cliente.
  • O nível de isolamento pode ser definido no cliente em diferentes níveis (nível de driver, conexão, pacote e instrução). Se nenhum for definido, o padrão no cliente é CS.
  • O nível de isolamento é sobrescrito do nível externo para o interno (consulte Figura 1). O último nível de isolamento interior é o nível de isolamento efetivo.

Agradecimento

Gostaria de agradecer a Andreas Weininger e Dirk Fechner por revisarem este artigo.


Recursos

Aprender

Obter produtos e tecnologias

Discutir

Sobre o autor

Author Photo: Peter Schurr

Peter Schurr trabalha como IT Services Specialist para o IBM Software Group. Sua área de conhecimento é a administração e desenvolvimento de aplicativos para DB2 em plataformas distribuídas. Ele tem 12 anos de experiência com DB2 e é DBA Avançado Certificado IBM e Desenvolvedor de Aplicativo Certificado IBM. As áreas de especialização de Peter são ajuste de desempenho, replicação, federação e modelagem de dados.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Information Management
ArticleID=751367
ArticleTitle=Determine o nível de isolamento efetivo no DB2 para Linux, UNIX e Windows
publish-date=08092011
author1-email=peter.schurr@de.ibm.com
author1-email-cc=

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).