本地数据库的事务范围

时间:2016-07-04 10:37:33

标签: c# sql-server transactionscope

我目前正在尝试使用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

5 个答案:

答案 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);
    }
}

Under what circumstances is an SqlConnection automatically enlisted in an ambient TransactionScope Transaction?

答案 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创建一些测试,看看有什么区别。