MVCC allows multiple versions of a data item to exist concurrently. When a transaction reads a data item, it gets the version that was committed before the transaction started. When a transaction writes to a data item, it creates a new version without altering the original data. This is often managed through timestamps or unique version identifiers.