A consistent read means that InnoDB uses
multi-versioning to present to a query a snapshot of the
database at a point in time. The query sees the changes made by
those transactions that committed before that point of time, and
no changes made by later or uncommitted transactions. The
exception to this rule is that the query sees the changes made
by earlier statements within the same transaction. Note that the
exception to the rule causes the following anomaly: if you
update some rows in a table, a SELECT will
see the latest version of the updated rows, but it might also
see older versions of any rows. If other users simultaneously
update the same table, the anomaly means that you may see the
table in a state that never existed in the database.
If you are running with the default REPEATABLE
READ isolation level, all consistent reads within the
same transaction read the snapshot established by the first such
read in that transaction. You can get a fresher snapshot for
your queries by committing the current transaction and after
that issuing new queries.
Consistent read is the default mode in which
InnoDB processes SELECT
statements in READ COMMITTED and
REPEATABLE READ isolation levels. A
consistent read does not set any locks on the tables it
accesses, and therefore other users are free to modify those
tables at the same time a consistent read is being performed on
the table.
Note that consistent read does not work over DROP
TABLE and over ALTER TABLE.
Consistent read does not work over DROP TABLE
because MySQL can't use a table that has been dropped and
InnoDB destroys the table. Consistent read
does not work over ALTER TABLE because
ALTER TABLE works by making a temporary copy
of the original table and deleting the original table when the
temporary copy is built. When you reissue a consistent read
within a transaction, rows in the new table are not visible
because those rows did not exist when the transaction's snapshot
was taken.
InnoDB uses a consistent read for select in
clauses like INSERT INTO ... SELECT and
UPDATE ... (SELECT) that do not specify
FOR UPDATE or IN SHARE
MODE if the
innodb_locks_unsafe_for_binlog option is set
and the isolation level of the transaction is not set to
serializable. Thus no locks are set to rows read from selected
table. Otherwise, InnoDB uses stronger locks
and the SELECT part acts like READ
COMMITTED, where each consistent read, even within the
same transaction, sets and reads its own fresh snapshot.

User Comments
Add your own comment.