Pergunta

Eu fui encarregado de executar os testes de unidade em um backend tempestade para Oracle para que possamos ver se a infra-estrutura é de qualidade suficiente para uso em produção. Um problema que eu estou correndo em é que eu estou recebendo ORA-08177 (não pode acessar serialize para esta operação) se eu ligar no modo serializável. O problema vai embora quando eu uso ler modo comprometido.

Agora que eu li esta peça tom artigo e isso indica que este é basicamente uma questão de concorrência.

Assumindo que eu só tenho um fio de ligação à base de dados e de mais ninguém no mundo está se conectando a esta base de dados, é possível obter este erro? E se assim for, alguém poderia me fornecer um exemplo de consulta que geraria este erro?

Ou isso é indicativo provável de um cursor ou a conexão não estar em algum lugar fechado? Ou uma transação não sendo confirmada ou revertida?

Foi útil?

Solução

"Não são gatilhos envolvidos, mas eu estou recebendo os erros nas declarações DDL, não na atualização ou de inserção."

DDL deve lidar com sua própria cometer. Basicamente eles um commit, então as alterações de metadados (que podem envolver um número de objetos subjacentes), em seguida, um commit novamente (assumindo que o DDL consegue - se falhar a mudança deve ser revertida)

.

Então, se você estava fazendo DDL, ele deve ser seguro para cometer, mudar a transação para ler comprometidos, faça o DDL, em seguida, mudar a parte traseira transação para serializado. Se você pode dar um teste de caso (ou pelo menos o tipo de DDL que você está falando) pode ajudar. A criação visão materializada ou CREATE TABLE AS SELECT, por exemplo, pode ser 'estranho', pois seria DDL (com sua peculiar cometer) mais DML.

Outras dicas

Com apenas uma sessão que você não deve obter este erro. O script a seguir no entanto vai gerar uma sessão secundário que vai atualizar uma linha de forma independente da primeira sessão, permitindo-nos para disparar um ORA-8177. Eu não tenho certeza se é isso que você quer.

Considere o seguinte:

SQL> alter session set isolation_level=serializable;

Session altered
SQL> create table test (a number);

Table created
SQL> insert into test values (1);

1 row inserted
SQL> commit;

Commit complete
SQL> declare
  2     pragma autonomous_transaction;
  3  begin
  4     update test set a = 2;
  5     commit;
  6  end;
  7  /

PL/SQL procedure successfully completed
SQL> update test set a = 3;

update test set a = 3

ORA-08177: can't serialize access for this transaction
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top