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 :
-
Alice
ouvre sa session de navigateur qui appelleDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
ouvre sa session qui appelleDELETE FROM TABLE1 WHERE Version = 'v1'
aprèsAlice
l'a fait mais avant qu'elle ne s'engage.
Bob
La transaction de attend depuisAlice
verrouillé les lignes avecVersion = 'v1'
-
Alice
valide sa transaction -
Bob
La 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