Domanda

Mi è stato affidato il compito di eseguire i test unitari su un backend di tempesta per l'oracolo in modo da poter vedere se il backend è di qualità sufficiente da utilizzare in produzione. Un problema in cui mi imbatto è che sto ricevendo ORA-08177 (impossibile serializzare l'accesso per questa transazione) se mi connetto in modalità serializzabile. Il problema scompare quando utilizzo la modalità di lettura read.

Ora ho letto this ask tom articolo e indica che si tratta sostanzialmente di un problema di concorrenza.

Supponendo che ho solo un thread che si collega al database e nessun altro al mondo  si sta connettendo a questo database, è possibile ottenere questo errore? E se è così, qualcuno potrebbe fornirmi una query di esempio che genererebbe questo errore?

O questo è probabilmente indicativo di un cursore o di una connessione che non viene chiusa da qualche parte? O una transazione non viene commessa o ripristinata?

È stato utile?

Soluzione

" Ci sono sono coinvolti trigger, ma visualizzo gli errori sulle istruzioni DDL, non sull'aggiornamento o l'inserimento. & Quot;

Le istruzioni DDL devono gestire il proprio commit. Fondamentalmente eseguono un commit, quindi i metadati cambiano (che può coinvolgere un numero di oggetti sottostanti) quindi un nuovo commit (supponendo che il DDL abbia esito positivo - in caso contrario il rollback dovrebbe essere ripristinato).

Quindi, se stavi eseguendo DDL, dovrebbe essere sicuro eseguire il commit, modificare la transazione in lettura impegnata, eseguire il DDL, quindi riportare la transazione in serializzabile. Se riesci a fornire un caso di test completo (o almeno il tipo di DDL di cui stai parlando), può essere d'aiuto. Una creazione di vista materializzata o CREATE TABLE AS SELECT, ad esempio, può essere "dispari" in quanto sarebbe DDL (con il suo impegno particolare) più DML.

Altri suggerimenti

Con una sola sessione non dovresti ricevere questo errore. Lo script seguente genererà tuttavia una sessione secondaria che aggiornerà una riga indipendentemente dalla prima sessione, consentendoci di attivare un ORA-8177. Non sono sicuro se questo è quello che vuoi.

Si consideri:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top