Transaction isolation levels control what changes from concurrent transactions are visible, ranging from READ_UNCOMMITTED (sees everything, never use) to SERIALIZABLE (full isolation, slowest).
MVCC keeps multiple versions of each row so that readers see a consistent snapshot without blocking writers, and writers create new versions instead of overwriting the old ones.
Isolation level controls what data a transaction can see (database-wide), while @Lock controls which rows a transaction holds exclusively (row-level) -- they are complementary and used together.