2010-10-01 4 views
0

Я использую linq-sql, и это то, что мне нужно.Как повторить транзакцию, которая потерпела неудачу из-за тупика?

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

+0

Было бы лучше, если вы поняли, почему вы получаете затор, а не просто повторение сделки. –

+0

У меня есть таблица с именем assetmeterreadings, на которой эта транзакция запрашивает проверку бизнес-правил. Но эта таблица постоянно используется другими транзакциями. –

+0

@Robert Harvey; вы не можете ... только уменьшить их – gbn

ответ

0

Да, это нормально использовать этот подход. Мы делаем что-то подобное. Я бы сделал небольшую задержку, скажем, 500 мс.

С блокировкой стратегии блокировки SQL Server (и Sybase) всегда будет: вы можете уменьшить возможность только as per MSDN (for 2000 bit still valid). Который также говорит, чтобы повторить попытку.

Я также видел коммерческие приложения, которые тоже повторяются.

Другой вариант заключается в обеспечении snapshot isolation, который не является совершенным, хотя

+0

Проблема в том, что это даже происходит при простых чтениях. Невозможно завершить повторную попытку для всех чтений. Это не чисто. –

+1

Считывание обычно не должно затормозить. Вы уверены, что это не какая-то сделка? – gbn

+0

hmm читает, оказывается, являются взаимоблокировками, в linq уровень изоляции транзакции по умолчанию считывается и, следовательно, проблема. –

Смежные вопросы