| Bug #31703 | Should Throw NotSupportedException When Enlisting In Distributed Transaction | ||
|---|---|---|---|
| Submitted: | 18 Oct 2007 20:13 | Modified: | 13 Nov 2007 11:34 |
| Reporter: | Dean Ward | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / NET | Severity: | S2 (Serious) |
| Version: | 5.1.3 RC | OS: | Windows (XP SP2) |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | Promotable Single Phase Enlistment, PSPE, TransactionScope | ||
[23 Oct 2007 20:54]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/36202
[23 Oct 2007 20:54]
Reggie Burnett
Fixed in 5.1.4
[5 Nov 2007 13:14]
Tonci Grgin
Hi Dean and thanks for your report. Our c/NET team was faster than me but I hope you don't mind that the problem is solved :-) Thanks for your interest in MySQL.
[13 Nov 2007 11:34]
MC Brown
A note has been added to the 5.1.4 changelog:
Connector/NET would incorrectly report success when enlisting in
a distributed transaction, although distributed transactions are
not supported.

Description: In MySqlConnection::EnlistConnection there is the following code: if (this.driver.CurrentTransaction == null) { MySqlPromotableTransaction promotableSinglePhaseNotification = new MySqlPromotableTransaction(this, transaction); transaction.EnlistPromotableSinglePhase(promotableSinglePhaseNotification); ... } As MySql Connector/Net doesn't support promotable single phase enlistment just yet it should read: if (this.driver.CurrentTransaction == null) { MySqlPromotableTransaction promotableSinglePhaseNotification = new MySqlPromotableTransaction(this, transaction); if (!transaction.EnlistPromotableSinglePhase(promotableSinglePhaseNotification)) throw new NotSupportedException(); ... } EnlistPromotableSinglePhase will return false if the transaction is already a distributed transaction - in which case the MySql driver will not be able to successfully participate in it. How to repeat: using (TransactionScope txScope = new TransactionScope()) { using (SqlConnection sqlConnection = new SqlConnection("Database=Test;Server=(local);Integrated Security=SSPI")) { sqlConnection.Open(); using (SqlCommand sqlCommand = new SqlCommand("SELECT * FROM TEST", sqlConnection)) { sqlCommand.ExecuteNonQuery(); } } // the transaction scope will promote the ambient transaction // to a distributed transaction as soon as the second connection // is opened. MySql doesn't support distributed (MSDTC) transactions // so should throw a NotSupportedException using (MySqlConnection mySqlConnection = new MySqlConnection("Database=test;Server=localhost;Uid=test;Password=test")) { mySqlConnection.Open(); using (MySqlCommand mySqlCommand = new MySqlCommand("SELECT * FROM TEST", mySqlConnection)) { mySqlCommand.ExecuteNonQuery(); } } txScope.Complete(); } Suggested fix: See above.