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 ANSI | Nível de isolamento do DB2 | Leituras sujas | Leituras não repetidas | Leituras fantasma |
|---|---|---|---|---|
| Serializável | RR (leitura repetida) | Não | Não | Não |
| Leitura repetida | RS (estabilidade de leitura) | Não | Não | Sim |
| Leitura confirmada | CS (estabilidade do cursor) | Não | Sim | Sim |
| Leitura não confirmada | UR (leitura não confirmada) | Sim | Sim | Sim |
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.
- 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 JDBCConnection con = DriverManager.getConnection(this.aURL ,this.USER, this.PWD); con.setTransactionIsolation( Connection.TRANSACTION_READ_UNCOMMITTED )
- 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çãosql= "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
| API | Nível | Descrição | Comando e exemplo |
|---|---|---|---|
| SQL | Driver | Na linha de comando do DB2 (db2cmd/shell) para a sessão atual | db2 "SET CURRENT ISOLATION isolevel
Por exemplo, db2 "SET CURRENT ISOLATION RS" |
| CLI | Conexão | Em aplicativos de | Configurando o atributo SQL_ATTR_TXN_ISOLATION |
| Driver JDBC tipo 4 | Conexão | Através do método setTransactionIsolation | setTransactionIsolation(isolevel_constant)
Por exemplo, con.setTransactionIsolation( Connection.TRANSACTION_READ_UNCOMMITTED ) |
| ODBC | Driver | Por configuração ODBC | Usando a palavra-chave TXNISOLATION no arquivo db2cli.ini Por exemplo, db2 "update cli cfg at user level for section TESTDB using TXNISOLATION 4" |
| SQLJ | Pacote | Para SQLJ pela opção de ligação de perfil SQLJ | db2sqljbind -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ática | Pacote | Em SQL estática com uma opção de ligação | db2 "BIND bindfile ISOLATION isolevel" Por exemplo, db2 "BIND client11.bnd ISOLATION RS" |
| Procedimentos SQL | Pacote | Em procedimentos SQL, por um parâmetro especial de registro | db2set 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
| CLI | Driver JDBC tipo 4 | ODBC, SQL integrada, Cobol | |
|---|---|---|---|
| Atributo | TXNISOLATION | Método setTransactionIsolation | SQL_ATTR_TXN_ISOLATION |
| UR | 1 | Connection.TRANSACTION_READ_UNCOMMITTED | SQL_TXN_READ_UNCOMMITTED |
| CS | 2 | Connection.TRANSACTION_READ_COMMITTED> | SQL_TXN_READ_COMMITTED |
| RS | 4 | Connection.TRANSACTION_REPEATABLE_READ | SQL_TXN_REPEATABLE_READ |
| RR | 8 | Connection.TRANSACTION_SERIALIZABLE | SQL_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
| Ferramenta | Nível relatado | Palavra-Chave | Valores/Campos | Exemplo |
|---|---|---|---|---|
| Captura instantânea de SQL dinâmica (ou "db2pd -dyn"). | Nível de instrução | Texto da instrução | Cláusula WITH isolevel | WITH UR |
| Captura instantânea de aplicativo | Nível da conexão | Nome do pacote | SYSSHxyy | SYSSH300 (3=RS) |
| Monitor de eventos para instruções | Nível da conexão | Nome do pacote | SYSSHxyy | SYSSH300 (3=RS) |
| Cache dinâmico (db2pd -dyn) | Nível da conexão | Ambientes de SQL dinâmica | StmtUID EnvID Iso | 11 1 RR |
| Nível de isolamento efetivo (db2pd -act) | Nível de instrução | Lista de instrução de ação: | StmtUID EffISO | 11 0 |
| Funções e monitores de eventos do Workload Manager (WLM) | Nível de instrução | STMT_ISOLATION | 0..4 | 1 (=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 -activee 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
| Ferramenta | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| Nome do pacote | NC | UR | CS | RS | RR |
| db2pd EffIso | RR | CS | UR | RS | - |
| EFFECTIVE_ISOLATION (WLM_GET_ACTIVITY_DETAILS) | RR | CS | UR | RS | - |
| STMT_ISOLATION | NENHUM | UR | CS | RS | RR |
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âmicaComando: 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 aplicativoComando: 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 eventoComando: 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âmicoComando: 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çãoComando: 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. WLMCREATE 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 WLMComando: 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.
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 -dynamicrelata 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ãoDynamic 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 -dynamicrelata 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çãoDynamic 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 -dynamicrelata 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çãoDynamic 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 CLISQLConnect( ) <--- 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
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 -dynamicsempre relata o nível de isolamento de conexão, e não o efetivo.db2pd -staticpara 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 -dynamicsempre relata o nível de isolamento de conexão.db2pd -activepode 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.
Gostaria de agradecer a Andreas Weininger e Dirk Fechner por revisarem este artigo.
Aprender
- Acesse o
IBM Data Server Driver para níveis de isolamento JDBC e SQLJ um tópico no centro de informações para mais sobre níveis de isolamento suportados.
- Localize o tópico
DB2 CLI bind files and package names no centro de informações para mais sobre a codificação de nomes de pacote.
- Leia o tópico Requirements for setting data access isolation levels para mais sobre o IBM WebSphere Application Server.
- Confira o elemento de monitor de isolamento de instrução.
- Saiba como configurar a palavra-chave de configuração TxnIsolation de CLI/ODBC.
- Saiba mais sobre Information Management na zona de Information Management no developerWorks. Encontre documentação técnica, artigos de instruções, treinamento, downloads, informações de produtos, e muito mais.
- Fique por dentro dos
eventos técnicos e webcasts do developerWorks.
- Siga o developerWorks no Twitter.
Obter produtos e tecnologias
- Crie seu próximo projeto de desenvolvimento com a
software de avaliação da IBM,
disponível para download diretamente no developerWorks.
Discutir
- Participar do fórum de discussão.
- Confira os
blogs do developerWorks e participe da
comunidade do developerWorks.

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.