Sql 如何重试因死锁而失败的事务?

Sql 如何重试因死锁而失败的事务?,sql,sql-server-2008,deadlock,transactionscope,Sql,Sql Server 2008,Deadlock,Transactionscope,我使用LINQSQL,这就是我所需要的 Sub Commit() Try StepStart: Transaction Scope Serialized Begin Transaction Check BusinessRule1 Check BusinesRule2 if BusinessRulesFailed { Transaction.Rollback } else { Query = db.out db.SubmitChanges() Transaction.Commit() }

我使用LINQSQL,这就是我所需要的

Sub Commit()
Try

StepStart:

Transaction Scope Serialized
Begin Transaction
Check BusinessRule1
Check BusinesRule2

if BusinessRulesFailed
{ Transaction.Rollback }
else {
Query = db.out
db.SubmitChanges()
Transaction.Commit()
}

Catch DeadLockException
Goto StepStart

End Try

End Sub

采用这种方法可以吗?有人能给我举个C#或VB.Net的例子吗?是的,使用这种方法是可以的。我们也做类似的事情。不过我还是会稍微延迟一下,比如说500毫秒

对于SQL Server(和Sybase)锁定策略,死锁总是会发生:您只能减少这种可能性。这也表示要重试

我也看到过一些商业应用也会重试


另一个选项是启用一个并不完美的选项,尽管

如果您能找出导致死锁的原因,而不是简单地重试事务,可能会更好。我有一个名为AssetMeterReaders的表,此事务将在该表上查询业务规则检查。但该表经常被其他交易使用。@Robert Harvey;你不能。。。唯一的问题是,它甚至发生在简单的读取中。无法包装所有读取的重试。这不干净。读取通常不应该死锁。你确定这不是某种类型的事务吗?hmm读取结果确实是死锁,在linq中,默认事务隔离级别是READCOMITED,因此出现了问题。READCOMITED是整个系统的默认值。这不是问题:相信我,请阅读你确定阅读不应该发出死锁吗?