带有TransactionScopeReadCommited的DeadLock SQL服务器
我在购买预订场景期间遇到了业务层的死锁问题(顺序调用读取,插入和更新预留数据的方法)。
每种服务方法都会部分填满预订数据。 一些方法以ReadCommited模式嵌入到TransactionsScope中。 范围交易没有链接。 SQL语句通过ADO.NET在不使用SqlTransaction的情况下通过SQL Server 2012数据库发送通常,在这些服务的表上进行的每个插入/更新/删除命令都受到预留标识符的限制(这意味着两个并行预留路径不能改变相同的数据)。
在事实中:我运行一段代码,在Parralel(Parralel.Invoke)中运行50个完整预订课程。 请注意,在预订过程中,所有内容都是连续的,没有任何内容是同时启动的。 过了一会儿,我收到了一个僵局。 根据这段代码的启动,在插入sql server profiler的同一个sql请求中,死锁并不总是会发生(很少),这会告诉我许多错误图,但它的理解相当复杂在一个死锁的例子中例如: - 参与死锁的select查询,select返回最后x个保留,没有任何特定的过滤器(因此如果这些保留中的一个存在未提交的更新订单,潜在地“阻塞”) - 参与死锁,select返回客户做出的最后x个保留(理论上,保留路由是唯一的,所以不能交叉) - 一个“受害者”更新请求,其中死锁是启动的,它更新了预留表中的一个字段具体预订。 我希望接收查询中发送的参数,以确保接收或更新的数据是否跨越,但我无法在分析器中找到它(我通过所有涉及锁的过滤器)
我还看到,如果我在非完整事务中的行上有更新命令,那么表上的选择会使行恢复超时(如果我在transaction.complete之前留下断点)。 这是正常的吗? 我明白是的,但并不是很清楚。 请注意,我的交易不是超长的,最多为2 3秒。 因为实际上我可以在一行上有一个更新顺序,另一个线程在这一行上进行选择。 但我期望在这种情况下,select会保持等待,并且一旦更新的事务被提交,ca就会返回结果。
总之我没有太多的想法,我接受任何建议,
谢谢 !
朱利安
链接地址: http://www.djcxy.com/p/32867.html上一篇: DeadLock SQL server withTransactionScope ReadCommited
下一篇: Deadlocks after extracting part of the trigger into a stored procedure