guardar o valor atual da carteira de cobranca: create table carteira_cobranca ( codbanco integer not null, codcedente integer not null, nossonumero integer not null); Cada linha da tabela seria uma carteira de cobranca que guarda o codigo do banco, o codigo cedente e o valor atual do nosso numero, o analista pensou assim para nao precisar criar sequencias no Oracle. Isso porque toda vez que se cria uma carteira nova, uma nova sequencia precisaria ser criada, solicitando ao DBA a criacao da mesma. Se uma empresa tem, por exemplo, 50 filiais e trabalha com 5 bancos diferentes entao teriamos 250 carteiras. E se esta empresa desejasse trabalhar com algum outro banco, mais 50 carteiras de cobranca seriam necessarias. Este fato inviabiliza a manutencao (uma vez que e faixa numerica e o nosso numero precisa ser reiniciado) e a nomeacao das sequencias. Uma vez criada a tabela, em sequencia cria-se uma funcao PL/SQL que retorna o nosso numero, um codigo simplificado segue abaixo: create function nosso_numero(p_codbanco in carteira_cobranca.codbanco%type, p_codcedente in carteira_cobranca.codcedente%type) return number is v_nossonumero carteira_cobranca.nossonumero%type; begin -- Altera o nosso numero e retorna o sequencial... update carteira_cobranca c set c.nossonumero = nossonumero + 1 where c.codbanco = p_codbanco and c.codcedente = p_codcedente returning c.nossonumero into v_nossonumero; return v_nossonumero;end; / Vale lembrar que em um sistema real, essa funcao precisaria checar se o nosso numero nao chegou ao valor maximo disponivel da faixa, e reiniciar a contagem, mas isso foi suprimido, pois o foco deste artigo e o bloqueio que ocorre da instrucao UPDATE. O problema surge quando o departamento financeiro precisa gerar um lote de boletos para uma determinada carteira, e entao enquanto nao terminar o processamento do lote com um Commit ou Rollback, os operadores de frente de caixa nao conseguem gerar novos boletos desta mesma carteira. Devido ao bloqueio que ocorre na funcao nosso_numero que impede alteracoes no registro da carteira de cobranca. Este e o comportamento padrao no controle de concorrencia de banco de dados, para que o banco de dados garanta o I do ACID, que e o Isolamento de transacoes, o SGBD usa o recurso de bloqueio sobre a linha alterada e as transacoes ocorrem sequenciais sobre esta linha. Primeiro e executada uma transacao e so depois do termino da primeira e executada a segunda. E e exatamente nestas situacoes que a transacao autonoma pode ser uma excelente ferramenta. O bloqueio na tabela carteira cobranca iria somente ocorrer dentro da funcao nosso_numero e nao dentro da transacao de geracao em lote dos boletos.A funcao seria reescrita da forma abaixo: create or replace function nosso_numero(p_codbanco in carteira_cobranca.codbanco%type, p_codcedente in carteira_cobranca.codcedente%type) return number isPragma Autonomous_Transaction; v_nossonumero carteira_cobranca.nossonumero%type; begin -- Altera o nosso numero e retorna o sequencial... update carteira_cobranca c set c.nossonumero = nossonumero + 1 where c.codbanco = p_codbanco and c.codcedente = p_codcedente returning c.nossonumero into v_nossonumero;commit; return v_nossonumero;end; / Nesse exemplo se o departamento financeiro fosse gerar um lote com 1000 boletos e apos gerar uns 5 boletos, sendo o ultimo com o nosso numero igual a 150 e neste instante algum operador do caixa gerasse um