我目前正在尝试使用TranactionScope和本地文件数据库(mdf)实现一些端到端测试(E2E)。有趣的是查询没有被回滚,所以我的所有更新/插入都是持久的。我不明白做错了什么
using (new TransactionScope())
{
var newItem1 = new SomeEntity { Id = 4, Remark = "Test 2" };
var newItem2 = new SomeEntity { Id = 5, Remark = "Test 2" };
var x = new List<SomeEntity> { newItem1, newItem2 };
_testTvp.SaveSomeEntities(x);
var result = _test.GetSomeEntity(4);
Assert.AreEqual(newItem1.Remark, result.Remark);
result = _test.GetSomeEntity(5);
Assert.AreEqual(newItem2.Remark, result.Remark);
}
我的连接字符串是:
有关更多代码,请参阅此处:enter link description here
答案 0 :(得分:0)
没有错。这就是TransactionScope
的工作原理。
来自MSDN
如果事务范围内没有异常(即介于两者之间) TransactionScope对象的初始化和调用 它的Dispose方法),然后是范围内的事务 参与者被允许继续。如果在其中发生异常 交易范围,它参与的交易将 回滚。
仅在发生异常时回滚事务
答案 1 :(得分:0)
为什么不试试
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
using (SqlTransaction sqlTrans = sqlConnection.BeginTransaction())
{
//put your code here
}
}
答案 2 :(得分:0)
根据你的堆栈使用类似的东西你可能有环境交易:
string connStr = "...; Enlist = false";
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection conn1 = new SqlConnection(connStr))
{
conn1.Open();
conn1.EnlistTransaction(Transaction.Current);
}
}
答案 3 :(得分:0)
试试这个:
using (new scope = new TransactionScope())
{
var newItem1 = new SomeEntity { Id = 4, Remark = "Test 2" };
var newItem2 = new SomeEntity { Id = 5, Remark = "Test 2" };
var x = new List<SomeEntity> { newItem1, newItem2 };
_testTvp.SaveSomeEntities(x);
var result = _test.GetSomeEntity(4);
Assert.AreEqual(newItem1.Remark, result.Remark);
result = _test.GetSomeEntity(5);
Assert.AreEqual(newItem2.Remark, result.Remark);
//either of the two following:
Transaction.Current.Rollback();
scope.Dispose();
}
答案 4 :(得分:0)
好吧,我无法弄清楚到底出了什么问题。可能的解决方案是删除插入的数据。不是最好的方法,但更好的方法是使用DbTransaction.I将尝试使用真正的sql server创建一些测试,看看有什么区别。