Just my thought on this article...
Why do we need a begin transaction statement at the start of the procedure USP_Business_Process. Everytime the sub-procedure : USP_Get_Value_For_Key is called, it will always have a unique value.
So, the statement : BEGIN TRANSACTION Business_Process, should be after the call to the procedure USP_Get_Value_For_Key.
i.e after the statement : SELECT @val -- Print key value for display,
in the procedure: USP_Business_Process.
This way there will be no blocking issue for the table: tbl_kvp
Haven't tested this but think this should work.