Om anropen till SP1 följt av SP2 är atomära, bör de kombineras i T-SQL. Eller förlora c#-transaktionen. Du förlänger transaktionen i onödan med tur och retur.
Dessutom, varför ha UPDLOCK på SP1UPDLOCK men inte för SP1? Jag kan inte se varför. Om problemet är låstips, använd dem inte. Om något är serialiserbart (varför?), gör det igen till ett enda atomsamtal
Observera att standardinställningen är LÄS ENGAGERA ändå
Slutligen, menar du "semafor" inte lås? Använder sp_getapplock kommer att styra flödet genom koden utan att använda lås på data