mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
do not clear list of changed tables on one statement rollback (Bug #4213)
mysql-test/r/innodb_cache.result: test of rollback one statement in transaction mysql-test/t/innodb_cache.test: test of rollback one statement in transaction sql/handler.cc: clear changed tables list only for total roll back
This commit is contained in:
@ -98,7 +98,7 @@ commit;
|
|||||||
show status like "Qcache_queries_in_cache";
|
show status like "Qcache_queries_in_cache";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Qcache_queries_in_cache 1
|
Qcache_queries_in_cache 1
|
||||||
drop table if exists t1;
|
drop table t3,t2,t1;
|
||||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB;
|
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB;
|
||||||
select count(*) from t1;
|
select count(*) from t1;
|
||||||
count(*)
|
count(*)
|
||||||
@ -108,3 +108,22 @@ select count(*) from t1;
|
|||||||
count(*)
|
count(*)
|
||||||
1
|
1
|
||||||
drop table t1;
|
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)) TYPE=innodb;
|
||||||
|
CREATE TABLE t2 ( id int(10) NOT NULL auto_increment, b varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY b (b)) TYPE=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`)) TYPE=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 );
|
||||||
|
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;
|
||||||
|
@ -48,10 +48,31 @@ show status like "Qcache_queries_in_cache";
|
|||||||
show status like "Qcache_hits";
|
show status like "Qcache_hits";
|
||||||
commit;
|
commit;
|
||||||
show status like "Qcache_queries_in_cache";
|
show status like "Qcache_queries_in_cache";
|
||||||
|
drop table t3,t2,t1;
|
||||||
|
|
||||||
drop table if exists t1;
|
|
||||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB;
|
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB;
|
||||||
select count(*) from t1;
|
select count(*) from t1;
|
||||||
insert into t1 (id) values (0);
|
insert into t1 (id) values (0);
|
||||||
select count(*) from t1;
|
select count(*) from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# one statement roll back inside transation
|
||||||
|
#
|
||||||
|
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)) TYPE=innodb;
|
||||||
|
CREATE TABLE t2 ( id int(10) NOT NULL auto_increment, b varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY b (b)) TYPE=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`)) TYPE=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;
|
||||||
|
begin;
|
||||||
|
insert into t3 VALUES ( NULL, 1, 1, 2 );
|
||||||
|
-- error 1062
|
||||||
|
insert into t3 VALUES ( NULL, 1, 1, 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;
|
||||||
|
drop table t3,t2,t1;
|
||||||
|
|
||||||
|
@ -446,13 +446,12 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
|
|||||||
reinit_io_cache(&thd->transaction.trans_log,
|
reinit_io_cache(&thd->transaction.trans_log,
|
||||||
WRITE_CACHE, (my_off_t) 0, 0, 1);
|
WRITE_CACHE, (my_off_t) 0, 0, 1);
|
||||||
thd->transaction.trans_log.end_of_file= max_binlog_cache_size;
|
thd->transaction.trans_log.end_of_file= max_binlog_cache_size;
|
||||||
|
if (operation_done)
|
||||||
|
thd->transaction.cleanup();
|
||||||
}
|
}
|
||||||
thd->variables.tx_isolation=thd->session_tx_isolation;
|
thd->variables.tx_isolation=thd->session_tx_isolation;
|
||||||
if (operation_done)
|
if (operation_done)
|
||||||
{
|
|
||||||
statistic_increment(ha_rollback_count,&LOCK_status);
|
statistic_increment(ha_rollback_count,&LOCK_status);
|
||||||
thd->transaction.cleanup();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* USING_TRANSACTIONS */
|
#endif /* USING_TRANSACTIONS */
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
|
Reference in New Issue
Block a user