Ако извикванията към SP1, последвани от SP2, са атомарни, те трябва да бъдат комбинирани в T-SQL. Или загубете транзакцията c#. Вие удължавате транзакцията ненужно с двупосочни пътувания.
Освен това, защо има UPDLOCK на SP1UPDLOCK, но не и за SP1? Не виждам защо. Ако проблемът е в съветите за заключване, не ги използвайте. Ако нещо може да се сериализира (защо?), тогава отново, направете го едно атомно извикване
Имайте предвид, че по подразбиране все пак е READ COMMITTED
И накрая, имате предвид, че "семафорът" не се заключва? Използване на sp_getapplock ще контролира потока през кода, без да използва ключалки на данните