Bug #21409 Incorrect result returned when in READ-COMMITTED with query_cache ON
| Submitted: | 2 Aug 2006 4:43 | Modified: | 19 Jun 2010 0:08 |
|---|---|---|---|
| Reporter: | Morgan Tocker | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
| Version: | 4.1,.5.0,5.1 | OS: | Any (ALL) |
| Assigned to: | Sunny Bains | CPU Architecture: | Any |
[2 Aug 2006 4:43]
Morgan Tocker
[2 Aug 2006 7:01]
Heikki Tuuri
Morgan, how do you set the isolation level to READ COMMITTED? --Heikki
[2 Aug 2006 7:49]
Morgan Tocker
> how do you set the isolation level to READ COMMITTED? In my.cnf
[2 Aug 2006 8:09]
Heikki Tuuri
Morgan, please show the exact line. --Heikki
[2 Aug 2006 11:45]
Morgan Tocker
# The MySQL server [mysqld] core-file transaction-isolation = READ-COMMITTED The testcase is quite easy to reproduce, but it seems every step needs to be followed in order.
[9 Aug 2006 1:33]
Morgan Tocker
Anybody else able to verify this? Seemed quite easy to create from the test case.
[9 Aug 2006 12:48]
Heikki Tuuri
Morgan, I will try to look at this today. I am working to get the number of 'active' non-fixed InnoDB bug reports back under 25. Currently, it is 30. There is some backlog. Regards, Heikki
[10 Aug 2006 7:32]
Morgan Tocker
Verified under 5.0.24 and... mysql1> select version(); +-----------------------------+ | version() | +-----------------------------+ | 5.0.25-nightly-20060803-log | +-----------------------------+ Anything else that it could be? My operating system is Ubuntu Dapper if it helps. Hardware is Intel x86 (Intel(R) Pentium(R) M processor 1.50GHz)
[10 Aug 2006 19:37]
Dean Ellis
I can repeat the behavior, but so far only on 5.1.12-beta-bk. Sometimes repeating the statement causes the row to become visible, sometimes not. If this is not a bug, we need to add some more information to our documentation regarding READ-COMMITTED. I used this test case: connect (c1,localhost,root,,); connect (c2,localhost,root,,); connection c1; set tx_isolation='read-committed'; set autocommit=0; drop table if exists t1, t2; create table t1 ( a int ) engine=innodb; create table t2 like t1; select * from t2; connection c2; set tx_isolation='read-committed'; set autocommit=0; insert into t1 values (1); commit; connection c1; select * from t1 where a=1; disconnect c1; disconnect c2; connect (c1,localhost,root,,); connect (c2,localhost,root,,); connection c1; set tx_isolation='read-committed'; set autocommit=0; select * from t2; connection c2; set tx_isolation='read-committed'; set autocommit=0; insert into t1 values (2); commit; connection c1; select * from t1 where a=2; select * from t1 where a=2; With output one time of: ... select * from t1 where a=2; a select * from t1 where a=2; a 2 ok And another: ... select * from t1 where a=2; a select * from t1 where a=2; a ok So it is not necessarily consistent.
[10 Aug 2006 20:54]
Heikki Tuuri
Dean, it might be that the 5.1 patch of http://bugs.mysql.com/bug.php?id=20213 fixes also this bug, if this actually is memory corruption. Can you edit ::store_lock() in ha_innodb.cc and test if you still can repeat? Regards, Heikki
[14 Aug 2006 17:04]
Dean Ellis
Heikki, Yes, modifying ha_innobase::store_lock() seems to correct this in 5.1.
[31 Aug 2006 3:41]
Morgan Tocker
An update to the testcase; It requires the query cache On. If all of the select queries in the test case has SQL_NO_CACHE in them, the testcase fails (note: it must be all, changing the last two selects and the testcase still works). Verified again in 5.0.25-nightly-20060821-log.
[21 Sep 2006 0:10]
Morgan Tocker
Updated bug title to mention query_cache must be on.
[9 Nov 2006 14:27]
Heikki Tuuri
The bug found: InnoDB-5.0 only sets its internal isolation level at the end of the first processed SQL statement. Since the first statement for client 1 in the second session is served from the query cache, InnoDB does not set its internal isolation level yet to READ COMMITTED at its end. http://bugs.mysql.com/bug.php?id=23165 is a duplicate of this bug report.
[9 Nov 2006 14:38]
Heikki Tuuri
The fix in 5.0:
This code in ha_innodb.cc, in ::external_lock():
if (trx->n_mysql_tables_in_use == 1) {
trx->isolation_level = innobase_map_isolation_level(
(enum_tx_isolation)
thd->variables.tx_isolation);
}
should be replaced with:
if (trx->n_mysql_tables_in_use == 1) {
trx->isolation_level = innobase_map_isolation_level(
(enum_tx_isolation)
thd->variables.tx_isolation);
if (trx->isolation_level <= TRX_ISO_READ_COMMITTED
&& trx->global_read_view) {
/* At low transaction isolation levels we let
each consistent read set its own snapshot */
read_view_close_for_mysql(trx);
}
}
and tested carefully.
#####################
The fix in 5.1:
This code in ha_innodb.cc in ::store_lock():
if (lock_type != TL_IGNORE
&& trx->n_mysql_tables_in_use == 0) {
trx->isolation_level = innobase_map_isolation_level(
(enum_tx_isolation)
thd->variables.tx_isolation);
}
should be replaced with:
if (lock_type != TL_IGNORE
&& trx->n_mysql_tables_in_use == 0) {
trx->isolation_level = innobase_map_isolation_level(
(enum_tx_isolation)
thd->variables.tx_isolation);
if (trx->isolation_level <= TRX_ISO_READ_COMMITTED
&& trx->global_read_view) {
/* At low transaction isolation levels we let
each consistent read set its own snapshot */
read_view_close_for_mysql(trx);
}
}
Sunny, please put these to 5.0 and 5.1, and test.
Regards,
Heikki
[1 Mar 2007 10:36]
Marko Mäkelä
Sent innodb-5.0-ss1319.tar.gz to MySQL
[6 Apr 2007 17:21]
Bugs System
Pushed into 5.0.40
[6 Apr 2007 17:25]
Bugs System
Pushed into 5.1.18-beta
[16 Apr 2007 12:12]
Heikki Tuuri
I think Sunny's description for the docs is ok.
[17 Apr 2007 19:49]
Paul DuBois
Noted in 5.0.40, 5.1.18 changelogs. For InnoDB, fixed consistent-read behavior of the first read statement, if the read was served from the query cache, for the READ COMMITTED isolation level.
[5 May 2010 15:03]
Bugs System
Pushed into 5.1.47 (revid:joro@sun.com-20100505145753-ivlt4hclbrjy8eye) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[6 May 2010 2:22]
Paul DuBois
Push resulted from incorporation of InnoDB tree. No changes pertinent to this bug. Re-closing.
[28 May 2010 5:46]
Bugs System
Pushed into mysql-next-mr (revid:alik@sun.com-20100524190136-egaq7e8zgkwb9aqi) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (pib:16)
[28 May 2010 6:16]
Bugs System
Pushed into 6.0.14-alpha (revid:alik@sun.com-20100524190941-nuudpx60if25wsvx) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[28 May 2010 6:43]
Bugs System
Pushed into 5.5.5-m3 (revid:alik@sun.com-20100524185725-c8k5q7v60i5nix3t) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[29 May 2010 15:32]
Paul DuBois
Push resulted from incorporation of InnoDB tree. No changes pertinent to this bug. Re-closing.
[17 Jun 2010 11:45]
Bugs System
Pushed into 5.1.47-ndb-7.0.16 (revid:martin.skold@mysql.com-20100617114014-bva0dy24yyd67697) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[17 Jun 2010 12:23]
Bugs System
Pushed into 5.1.47-ndb-6.2.19 (revid:martin.skold@mysql.com-20100617115448-idrbic6gbki37h1c) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
[17 Jun 2010 13:11]
Bugs System
Pushed into 5.1.47-ndb-6.3.35 (revid:martin.skold@mysql.com-20100617114611-61aqbb52j752y116) (version source revid:vasil.dimov@oracle.com-20100331130613-8ja7n0vh36a80457) (merge vers: 5.1.46) (pib:16)
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.052 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.