【问题标题】:Conflicted transactions冲突交易
【发布时间】:2017-03-29 07:33:59
【问题描述】:

当我的一些交易发生冲突时,我遇到了这个错误。我怎样才能找到冲突中的thansaction? (没有 sql server profiler)。

我正在使用快照隔离级别

System.Data.SqlClient.SqlException:快照隔离事务 由于更新冲突而中止。您不能使用快照隔离来 在数据库中直接或间接访问表“dbo.Users” 'IUMobileDbRelease' 更新、删除或插入已被删除的行 被另一个事务修改或删除。重试交易或 更改更新/删除语句的隔离级别。

    System.Data.Entity.Internal.InternalContext.SaveChanges()

【问题讨论】:

  • 您使用 SQL Server Profiler。或者扩展事件,替代分析器。更好的是,只是不要使用事务。请改用乐观并发。这是自 1990 年代以来的标准建议。使用事务的代码无法扩展并且将总是必须处理死锁和重试。自 1990 年代以来,应用程序使用乐观并发和行版本列来检测冲突更改而不使用事务
  • 另一种选择是使用 SNAPSHOT 事务隔离级别而不是可重复读取。它比乐观并发慢,但可以确保您不会遇到任何死锁,除非两个应用程序尝试修改同一行
  • 它是哪个 SQL Server 版本?考虑一下:stackoverflow.com/a/33272566/1132334
  • @dlatikay 所有当前版本都支持此功能(即 SQL Server 2012 及更高版本)。它仍然比乐观并发慢
  • @PanagiotisKanavos 我已经在使用快照隔离

标签: c# sql-server entity-framework


【解决方案1】:

在 EF6 中,您可以启用查询日志记录:

https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx

例如:

context.Database.Log = Console.Write;

将其输出与您获得的异常相关联,以将其缩小为一条语句。

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2016-01-13
    • 2012-08-02
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多