C# 如何避免sql死锁?

C# 如何避免sql死锁?,c#,asp.net,sql,sql-server-2008,C#,Asp.net,Sql,Sql Server 2008,我在使用MS-SQL 2008,在一个web项目中使用C#进行编码 目前,我陷入了sql死锁 我有两个事务,其中一个是长事务 当两个事务同时运行时,将发生死锁,并选择自动终止短事务 我目前的解决方案是捕获死锁异常并重做短事务,它运行良好,只是需要一些时间 但是,我想知道是否有任何解决方案可以从根本上避免死锁?不,你不能完全避免死锁,只能减轻它们 使用隔离模式。这基本上是正确的,但您必须注意SQL Server会这样做(DBA.SE答案)。此模式停止写入程序阻塞读卡器,但无助于写入程序-写入程序

我在使用MS-SQL 2008,在一个web项目中使用C#进行编码

目前,我陷入了sql死锁

我有两个事务,其中一个是长事务

当两个事务同时运行时,将发生死锁,并选择自动终止短事务

我目前的解决方案是捕获死锁异常并重做短事务,它运行良好,只是需要一些时间


但是,我想知道是否有任何解决方案可以从根本上避免死锁?

不,你不能完全避免死锁,只能减轻它们

  • 使用隔离模式。这基本上是正确的,但您必须注意SQL Server会这样做(DBA.SE答案)。此模式停止写入程序阻塞读卡器,但无助于写入程序-写入程序相互阻塞


  • 客户端重试逻辑。经典的方式

  • 尝试以相同的顺序进行表更新,例如T1->T2始终

  • 避免长事务:例如,客户机经常往返并保持事务的开放性。您可以通过存储过程、更好的索引或简单地调优查询来缓解这一问题


我希望这会有所帮助。尝试检查您的表是否有主键。你的陈述是什么?它们是更新、插入吗???@AzharKhorasany:重要吗?在本例中,它们都是insert。“客户端重试逻辑。经典的方式”,您的意思是尝试。。。捕获死锁异常并重试被终止的事务是正确的方式,不是吗?嗨,gbn,如果我有一个存储过程,并且两个事务都使用不同的输入调用该存储过程,则会发生死锁,那么是否有任何锁定方法来防止死锁?@kidgu:请创建一个新问题并添加代码、表和索引。这可能是一个指数问题。ThanksIt是一个相当庞大的项目,我很难提取必要的信息来提供给你们。死锁图足够了吗?哇,不。这意味着你在内存和磁盘上浪费了很多空间。这可能是一个暂时的解决办法,隐藏了真正的问题。但如果对你有用的话,嘿。没有这些表、索引和代码,我们就无能为力了。