polardbxengine/mysql-test/suite/ndb/t/ndb_fk_locking.test

106 lines
2.1 KiB
Plaintext

-- source include/have_ndb.inc
connect (con1,localhost,root,,test);
connect (con2,localhost,root,,test);
#
# found in http://www.mysqlperformanceblog.com/2010/09/20/instrumentation-and-the-cost-of-foreign-keys/
#
CREATE TABLE parent (
id INT NOT NULL AUTO_INCREMENT,
bogus_column char(32),
PRIMARY KEY (id)
) ENGINE=ndb;
CREATE TABLE child (
id INT NOT NULL AUTO_INCREMENT,
parent_id INT NOT NULL,
bogus_column char(32),
PRIMARY KEY (id),
KEY (parent_id)
) ENGINE=ndb;
alter table child add constraint fkname foreign key (parent_id) references parent (id) on update restrict on delete restrict;
INSERT INTO parent (bogus_column)
VALUES ('aaa'), ('bbb'), ('ccc'), ('ddd'), ('eee');
INSERT INTO child (parent_id,bogus_column) VALUES
(1, 'aaa'), (2,'bbb'), (3, 'ccc'),
(4, 'ddd'), (5, 'eee');
connection con1;
START TRANSACTION; # session1
connection con2;
START TRANSACTION; # session2
# session1
connection con1;
UPDATE child SET parent_id = 5 WHERE parent_id = 4;
#session2
connection con2;
UPDATE parent SET bogus_column = 'new!' WHERE id = 4;
#session2
connection con2;
--error ER_LOCK_WAIT_TIMEOUT
UPDATE parent SET bogus_column = 'new!' WHERE id = 5;
connection con1;
rollback;
connection con2;
rollback;
alter table child drop foreign key fkname;
#
# But if you use no action instead of restrict
# it works fine
#
alter table child add constraint fkname foreign key (parent_id) references parent (id);
connection con1;
START TRANSACTION; # session1
connection con2;
START TRANSACTION; # session2
# session1
connection con1;
UPDATE child SET parent_id = 5 WHERE parent_id = 4;
#session2
connection con2;
UPDATE parent SET bogus_column = 'new!' WHERE id = 4;
#session2
connection con2;
UPDATE parent SET bogus_column = 'new!' WHERE id = 5;
connection con1;
commit;
connection con2;
commit;
drop table child, parent;
#
# bug#7412
#
CREATE TABLE t1 (
id int(11) NOT NULL auto_increment,
ref_id int(11) default NULL,
PRIMARY KEY (id),
KEY ref_id (ref_id),
CONSTRAINT ref_id FOREIGN KEY (ref_id) REFERENCES t1 (id)
) ENGINE=ndb;
INSERT INTO t1 VALUES (1, 1);
DELETE FROM t1 WHERE id = 1;
drop table t1;