使用MySqlConnector for .NET完全支持TransactionScope对象吗?

时间:2009-12-12 16:15:30

标签: c# mysql

我正在编写单元测试(技术上是集成测试,因为我连接到数据库)并且我想在测试中的事务中创建记录,并在测试完成后回滚所有数据库修改。我的想法是,我将通过另一个API调用期望在数据库中找到的一个API调用来创建记录。

我有以下代码可以使用:

string connectionstring = "Server=MyDbServer;Database=MySchema;Uid=MyUser;Pwd=XXX;";
string sql = "Insert Into MyTable (date, Description) VALUES('2009-12-11', 'foo test description');";

 using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
 using (MySqlConnection conn = new MySqlConnection(connectionstring))
 {
       conn.Open();

       using (MySqlCommand cmd = new MySqlCommand(sql, conn))
       {
            cmd.ExecuteNonQuery();
       }
 }

但是,如果我将TransactionScope实例移动到MySqlCommand之前,则事务不会回滚,并且我的测试数据会持久保存到数据库中:

string connectionstring = "Server=MyDbServer;Database=MySchema;Uid=MyUser;Pwd=XXX;";
string sql = "Insert Into MyTable (date, Description) VALUES('2009-12-11', 'foo test description');";

using (MySqlConnection conn = new MySqlConnection(connectionstring))
{
    conn.Open();

    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
    {
        cmd.ExecuteNonQuery();
    }
}

我错过了什么?

注意:MySQL服务器(v.5.0.67-0ubuntu6)托管在linux机器上,MySqlConnecter版本为6.1.3

1 个答案:

答案 0 :(得分:5)

来自the docs(对于SQL Server compact,但仍然相关):

  

隐含地建立联系   不支持。参加一个   交易范围,你可以做到   以下:

     

在交易中打开连接   范围。

     

或者,如果连接已经存在   打开后,调用EnlistTransaction方法   在连接对象上。

在第一个示例中,您将在事务范围中打开连接。在第二场比赛中,你没有参加比赛。

尝试添加:

cmd.Connection.EnlistTransaction(Transaction.Current);

看看是否有帮助。