Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORA-08177 :impossible de sérialiser l'accès pour cette transaction

Vous utilisez une transaction sérialisable qui attend une autre transaction verrouillant la même table sur ROLLBACK .

Si cette autre transaction n'est pas annulée mais validée à la place, vous obtiendrez cette erreur.

Le scénario semble être le suivant :

  1. Alice ouvre sa session de navigateur qui appelle DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob ouvre sa session qui appelle DELETE FROM TABLE1 WHERE Version = 'v1' après Alice l'a fait mais avant qu'elle ne s'engage.

    Bob La transaction de attend depuis Alice verrouillé les lignes avec Version = 'v1'

    • Alice valide sa transaction

    • Bob La transaction de échoue avec Cannot serialize access

Pour contourner ce problème, définissez TRANSACTION ISOLATION LEVEL à READ COMMITTED :

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

Dans ce cas, Bob La requête de sera réémise après Alice valide ses modifications, comme si Bob La transaction de a commencé après Alice celui de a été commité.

Mettre à jour

Pourriez-vous s'il vous plaît poster une trace de votre connexion ?

Pour ce faire, lancez cette commande juste après la connexion :

(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();

, puis regardez dans $ORACLE_HOME\admin\udump pour un nouveau *.trc fichier