public static void Deadlock() { var testDb = new TestDbApi(); testDb.Person.Insert(new PersonModel { FirstName = "person1", LastName = "asdf", DateOfBirth = DateTime.Now }); testDb.Person.Insert(new PersonModel { FirstName = "person2", LastName = "asdf", DateOfBirth = DateTime.Now }); testDb.ExecuteNonQuery("insert into Person2 (FirstName, LastName, DateOfBirth) values ('person1', 'asdf', '2016-01-01');"); testDb.ExecuteNonQuery("insert into Person2 (FirstName, LastName, DateOfBirth) values ('person2', 'asdf', '2016-01-01');"); var cmd1 = @"update Person set FirstName = 'person1 updated1' where FirstName = 'person1'; waitfor delay '00:00:01'; update Person2 set FirstName = 'person2 updated1' where FirstName = 'person2';"; var cmd2 = @"update Person2 set FirstName = 'person2 updated2' where FirstName = 'person2'; waitfor delay '00:00:01'; update Person set FirstName = 'person1 updated2' where FirstName = 'person1';"; Parallel.Invoke( () => ExecuteInTransaction(cmd1, 0), () => ExecuteInTransaction(cmd2, 0)); }
public static void Run() { var db = new TestDbApi(); db.DropDbAndCreateAll(); Console.WriteLine("Results from stored proc:"); foreach (var m in ExecuteExampleProc("Johnny", 5)) { Console.WriteLine(m); } }
private static void ExecuteInTransaction(string cmd, int preCommitDelayMs) { using (var con = TestDbApi.CreateOpenConnection()) { using (var trans = con.BeginTransaction(IsolationLevel.Serializable)) { var sqlCmd = con.CreateCommand(); sqlCmd.CommandText = cmd; sqlCmd.Transaction = trans; sqlCmd.ExecuteNonQuery(); Thread.Sleep(preCommitDelayMs); trans.Commit(); } } }