2009-12-12 63 views
4

我正在写单元测试(技术上集成测试,因为我连接到数据库),我想在测试中的事务中创建记录,并在测试完成后回滚所有数据库修改。我的想法是,我将通过一个API调用创建记录,以便另一个API调用期望在数据库中找到。是否使用MySqlConnector for .NET完全支持TransactionScope对象?

我有下面的代码工作:

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服务器(诉5.0.67-0ubuntu6)托管在Linux机器上,MySqlConnecter版本6.1.3

回答

5

the docs(用于SQL Server紧凑,但仍然适用):

隐式征用连接是 不支持。要在 交易范围内登记,您可以执行以下操作:

在交易范围内打开连接 范围。

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

在第一个示例中,您正在事务范围中打开一个连接。在第二场,你不会参赛。

尝试增加:

cmd.Connection.EnlistTransaction(Transaction.Current); 

要看看是否有帮助。

+0

按预期工作。谢谢! – yanigisawa 2009-12-12 16:46:03

+0

很酷,不用担心 – RichardOD 2009-12-12 16:46:53