我正在编写单元测试(技术上是集成测试,因为我连接到数据库)并且我想在测试中的事务中创建记录,并在测试完成后回滚所有数据库修改.我的想法是,我将通过另一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将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();
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
注意:MySQL服务器(v.5.0.67-0ubuntu6)托管在linux机器上,MySqlConnecter版本是6.1.3
从文档(对于SQL Server compact,但仍然相关):
不支持隐式登记连接.要在事务范围中登记,您可以执行以下操作:
在事务范围中打开连接.
或者,如果连接已打开,请在连接对象上调用EnlistTransaction方法.
在第一个示例中,您将在事务范围中打开连接.在第二场比赛中你没有参加比赛.
尝试添加:
cmd.Connection.EnlistTransaction(Transaction.Current);
Run Code Online (Sandbox Code Playgroud)
看看是否有帮助.
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |