I was going to write something about this myself, but I don’t really have anything to say that David didn’t say already. The default isolation level used by the default TransactionScope constructor is Serializable, which is way less concurrent than SQL Server’s default setting of Read Committed. Unfortunately TransactionScope’s setting, even if not specified and left at the default, will override SQL Server’s, greatly reducing concurrency and increasing deadlocks. The solution is simply to specify the Read Committed isolation level every time. For example code how to do this, and for additional commentary, please see the original article.