TransactionScope,在 SQL Profiler 中的“开始事务”在哪里? (说明:该提问是关于IT技术的)

16

我需要在事务上下文中执行类似于这样的操作。

using(var context = new Ctx())
{

using (TransactionScope tran = new TransactionScope())
{
    decimal debit = 10M;
    int id = 1;

    var data = context.Cashier
        .Where(w => w.ID == id)
        .Select(s => new{ s.Money })
        .Single();


    Cashier cashier = new Cashier(){ ID = id };
    context.Cashier.Attach(cashier);

    cashier.Money = data.Money - debit;
    context.Entry(cashier).Property(p => p.Money ).IsModified = true;

    context.SaveChanges(SaveOptions.None);
    tran.Complete();
}
}

我正在运行SQL Profiler,但是看不到begin tran,请问这段代码是否正确?我有什么遗漏吗?


2
你可能已经进行了过滤吗?你也可以尝试在事务内创建ctx,看看是否会有所改变。 - Marc Gravell
为什么你在这段代码块中使用事务范围?如果你没有定义它,SaveChanges 会在内部使用事务,所以除非你正在使用多个事务资源或多次调用 SaveChanges,否则你不需要它。 - Ladislav Mrnka
Ladislav,这是为了防止错误的数据。如果别人在其他方法上修改收银员的金额,如果不在交易中,那么这个信息就会是错误的。 - Alexandre
@Alexandre:@Ladislav是正确的;SaveChanges函数在保存时总是使用事务。除非您在此代码块内多次调用SaveChanges(或进行其他数据库操作),否则不需要另一个事务。 - Adam Robinson
1
我理解你的意思,但是实体框架的begin tran仅在调用SaveChanges时发生,我需要在此之前进行事务处理,更具体地说是在:context.Cashier.Where(w => w.ID == id).Select(s => new{ s.Money }).Single()。 - Alexandre
1个回答

25

像@Marc在评论中所说的那样,这些消息可能被过滤掉了。在默认配置文件中,您只会捕获T-SQL事务消息,而不是直接使用API发送的事务消息(例如TransactionScope)。

在SQL Server Profiler中,转到跟踪事件选择并选中“显示所有事件”复选框。底部是一个“事务”类别,它应该提供您所需的内容。具体来说,以TM:开头的事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接