It is correct that update locks allow SELECT and that both hold locks until end of transactions.
Update locks blocks update locks so both will serialize your code. However, watch out for XLOXK
hint. SQL Server will effectively ignore XLOCK hint! There’s an optimization where SQL Server check
whether the data has changed since the oldest open transaction. If not, then an xlock is ignored.
This makes xlock hints basically useless and should be avoided. Just to a test and you will see…