using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Text; namespace Concurrency { public class Deadlocker : IDisposable { private readonly SqlConnection _anotherConnection; private readonly SqlCommand _command; private readonly SqlCommand _anotherCommand; private readonly IAsyncResult _anotherCommandStarted; public Deadlocker(SqlConnection connection, string hookCommand) { _command = connection.CreateCommand(); _command.CommandText = "SET DEADLOCK_PRIORITY LOW; BEGIN TRANSACTION; UPDATE Data.Hook1 SET i=1-i;"; _command.CommandType = CommandType.Text; _command.ExecuteNonQuery(); _anotherConnection = new SqlConnection(connection.ConnectionString + ";Asynchronous Processing=true"); _anotherConnection.Open(); _anotherCommand = _anotherConnection.CreateCommand(); _anotherCommand.CommandText = string.Format("SET DEADLOCK_PRIORITY HIGH; BEGIN TRANSACTION; {0};", hookCommand); _anotherCommand.CommandType = CommandType.Text; _anotherCommand.ExecuteNonQuery(); _anotherCommand.CommandText = "UPDATE Data.Hook1 SET i=1-i"; _anotherCommandStarted = _anotherCommand.BeginExecuteNonQuery(); } public void Dispose() { _command.CommandText = "IF @@TRANCOUNT>0 BEGIN ROLLBACK; END"; _command.ExecuteNonQuery(); _anotherCommand.EndExecuteNonQuery(_anotherCommandStarted); _anotherCommand.CommandText = _command.CommandText; _anotherCommand.ExecuteNonQuery(); _anotherConnection.Close(); } } }