mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
918a038165
The problem is that the query cache stores packets containing the server status of the time when the cached statement was run. This might lead to a wrong transaction status in the client side if a statement is cached during a transaction and is later served outside a transaction context (and vice-versa). The solution is to take into account the transaction status when storing in and serving from the query cache.
129 lines
3.1 KiB
Text
129 lines
3.1 KiB
Text
drop table if exists t1,t2,t3;
|
|
flush status;
|
|
set autocommit=0;
|
|
create table t1 (a int not null) engine=innodb;
|
|
insert into t1 values (1),(2),(3);
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
show status like "Qcache_queries_in_cache";
|
|
Variable_name Value
|
|
Qcache_queries_in_cache 0
|
|
drop table t1;
|
|
commit;
|
|
set autocommit=1;
|
|
begin;
|
|
create table t1 (a int not null) engine=innodb;
|
|
insert into t1 values (1),(2),(3);
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
show status like "Qcache_queries_in_cache";
|
|
Variable_name Value
|
|
Qcache_queries_in_cache 1
|
|
drop table t1;
|
|
commit;
|
|
create table t1 (a int not null) engine=innodb;
|
|
create table t2 (a int not null) engine=innodb;
|
|
create table t3 (a int not null) engine=innodb;
|
|
insert into t1 values (1),(2);
|
|
insert into t2 values (1),(2);
|
|
insert into t3 values (1),(2);
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
select * from t2;
|
|
a
|
|
1
|
|
2
|
|
select * from t3;
|
|
a
|
|
1
|
|
2
|
|
show status like "Qcache_queries_in_cache";
|
|
Variable_name Value
|
|
Qcache_queries_in_cache 3
|
|
show status like "Qcache_hits";
|
|
Variable_name Value
|
|
Qcache_hits 0
|
|
begin;
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
select * from t2;
|
|
a
|
|
1
|
|
2
|
|
select * from t3;
|
|
a
|
|
1
|
|
2
|
|
show status like "Qcache_queries_in_cache";
|
|
Variable_name Value
|
|
Qcache_queries_in_cache 6
|
|
show status like "Qcache_hits";
|
|
Variable_name Value
|
|
Qcache_hits 0
|
|
insert into t1 values (3);
|
|
insert into t2 values (3);
|
|
insert into t1 values (4);
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
4
|
|
select * from t2;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
select * from t3;
|
|
a
|
|
1
|
|
2
|
|
show status like "Qcache_queries_in_cache";
|
|
Variable_name Value
|
|
Qcache_queries_in_cache 2
|
|
show status like "Qcache_hits";
|
|
Variable_name Value
|
|
Qcache_hits 1
|
|
commit;
|
|
show status like "Qcache_queries_in_cache";
|
|
Variable_name Value
|
|
Qcache_queries_in_cache 2
|
|
drop table t3,t2,t1;
|
|
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) ENGINE=InnoDB;
|
|
select count(*) from t1;
|
|
count(*)
|
|
0
|
|
insert into t1 (id) values (0);
|
|
select count(*) from t1;
|
|
count(*)
|
|
1
|
|
drop table t1;
|
|
set GLOBAL query_cache_size=1355776;
|
|
CREATE TABLE t1 ( id int(10) NOT NULL auto_increment, a varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY a (a)) ENGINE=innodb;
|
|
CREATE TABLE t2 ( id int(10) NOT NULL auto_increment, b varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY b (b)) ENGINE=innodb;
|
|
CREATE TABLE t3 ( id int(10) NOT NULL auto_increment, t1_id int(10) NOT NULL default '0', t2_id int(10) NOT NULL default '0', state int(11) default NULL, PRIMARY KEY (id), UNIQUE KEY t1_id (t1_id,t2_id), KEY t2_id (t2_id,t1_id), CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`), CONSTRAINT `t3_ibfk_2` FOREIGN KEY (`t2_id`) REFERENCES `t2` (`id`)) ENGINE=innodb;
|
|
INSERT INTO t1 VALUES (1,'me');
|
|
INSERT INTO t2 VALUES (1,'you');
|
|
INSERT INTO t3 VALUES (2,1,1,2);
|
|
delete from t3 where t1_id = 1 and t2_id = 1;
|
|
select t1.* from t1, t2, t3 where t3.state & 1 = 0 and t3.t1_id = t1.id and t3.t2_id = t2.id and t1.id = 1 order by t1.a asc;
|
|
id a
|
|
begin;
|
|
insert into t3 VALUES ( NULL, 1, 1, 2 );
|
|
insert into t3 VALUES ( NULL, 1, 1, 2 );
|
|
ERROR 23000: Duplicate entry '1-1' for key 2
|
|
commit;
|
|
select t1.* from t1, t2, t3 where t3.state & 1 = 0 and t3.t1_id = t1.id and t3.t2_id = t2.id and t1.id = 1 order by t1.a asc;
|
|
id a
|
|
1 me
|
|
drop table t3,t2,t1;
|