Effectuer une transaction Oracle en utilisant C # et ODP.NET

Je suis confus. À première vue, effectuer une transaction en C # semble simple. D’ici:

http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleTransactionClass.htm

ssortingng constr = "User Id=scott;Password=tiger;Data Source=oracle"; OracleConnection con = new OracleConnection(constr); con.Open(); OracleCommand cmd = con.CreateCommand(); cmd.CommandText = "SELECT COUNT(*) FROM MyTable"; // Start a transaction OracleTransaction txn = con.BeginTransaction( IsolationLevel.ReadCommitted); try { // Insert the same row twice into MyTable cmd.CommandText = "INSERT INTO MyTable VALUES (1)"; cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery(); // This may throw an exception txn.Commit(); }.... 

Alors, créez une connexion, commencez une transaction sur cette connexion, puis vous poursuivez jusqu’à ce que vous souhaitiez valider ou annuler.

Cependant, d’autres sources, comme ici:

https://forums.oracle.com/thread/319121

advocate définissant la propriété Transaction de l’object OracleCommand lui-même. par exemple

 cmd.Transaction = txn; 

Cependant, d’autres sources indiquent que cette propriété est en lecture seule. Ce n’est pas en fait seulement lu, mais nulle part ne semble clairement dire ce qu’il fait.

Ma confusion est donc que l’existence de la propriété Transaction sur l’object OracleCommand semble suggérer qu’elle devrait être utilisée pour exécuter cette commande dans le cadre d’une transaction et que la documentation propre à Oracle n’utilise pas cette propriété. Alors à quoi ça sert?

Donc mes questions sont:

  1. Dois-je définir la propriété Transaction de ma commande OracleCommand? Si oui, qu’est-ce que cela fait exactement?
  2. Si j’ai démarré une transaction sur une connexion, TOUTES les commandes ultérieures exécutées sur cette connexion (jusqu’à une validation ou une annulation) font partie de cette transaction, même si je ne définit pas la propriété Transaction sur ces commandes?

1) dois-je définir la propriété Transaction de mon OracleCommand,

Non.

et si oui, qu’est-ce que cela fait exactement?

C’est un no-op.

OracleCommand “réutilise” automatiquement la transaction actuellement active sur OracleConnection la commande. La propriété Transaction existe simplement parce qu’elle a été déclarée dans la classe de base ( DbCommand ) et que vous ne pouvez pas ” DbCommand ” d’un membre de la classe héritée. Si vous le lisez, vous obtiendrez la transaction de la connexion (le cas échéant), le réglage ne fait rien.

2) Si j’ai démarré une transaction sur une connexion, TOUTES les commandes suivantes exécutées sur cette connexion (jusqu’à une validation ou une annulation) font partie de cette transaction, même si je ne définit pas la propriété Transaction sur ces commandes?

Exactement.