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 :
-
Aliceouvre sa session de navigateur qui appelleDELETE FROM TABLE1 WHERE Version = 'v1'Bobouvre sa session qui appelleDELETE FROM TABLE1 WHERE Version = 'v1'aprèsAlicel'a fait mais avant qu'elle ne s'engage.
BobLa transaction de attend depuisAliceverrouillé les lignes avecVersion = 'v1'-
Alicevalide sa transaction -
BobLa transaction de échoue avecCannot 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