Here is my opinion about the process of a DML statement.
1. user A update one row in tableA, but not commit.
2. the previous values of the row was recorded to the redo log buffer.
3. the new values of the row was recorded to the redo log buffer
4. Then the previous values of the row were both recorded to the rollback blocks in the data buffer cache.
5. Then the new values of the row were recorded to the data blocks in the data buffer cache.

If user B select the row which was updated but not committed by user A from tableA, the row was returned from rollback

segment
in the data buffer cache.

Only after user A execute the commit , the data in the data buffer was written to the datafiles.
The Above are my personal opinions.

Am i right ? if not please make some correct ions.