Since table1 is the parent table, I'd delete that row first and let a foreign key cascade to table2:
CREATE TABLE table1 (id INT NOT NULL AUTO_INCREMENT,
data1 varchar(10),
PRIMARY KEY(id)) ENGINE=INNODB;
CREATE TABLE table2 (id INT NOT NULL AUTO_INCREMENT,
table1_id INT NOT NULL,
data1 varchar(10),
PRIMARY KEY(id),
INDEX (table1_id),
FOREIGN KEY (table1_id) REFERENCES table1(id)
ON DELETE CASCADE) ENGINE=INNODB;
insert into table1 (data1) values ('row1');
insert into table1 (data1) values ('row2');
insert into table2 (table1_id, data1) values (1,'row21');
insert into table2 (table1_id, data1) values (2,'row22');
insert into table2 (table1_id, data1) values (2,'row23');
select * from table1;
select * from table2;
delete from table1 where id = 2;
select * from table1;
select * from table2;
drop table table2;
drop table table1;
If you really want to delete the row from table2 first, the only way I can see to do it is to combine the cascading delete from table1 with a trigger on table2:
CREATE TABLE table1 (id INT NOT NULL AUTO_INCREMENT,
data1 varchar(10),
PRIMARY KEY(id)) ENGINE=INNODB;
CREATE TABLE table2 (id INT NOT NULL AUTO_INCREMENT,
table1_id INT NOT NULL,
data1 varchar(10),
PRIMARY KEY(id),
INDEX (table1_id),
FOREIGN KEY (table1_id) REFERENCES table1(id)
ON DELETE CASCADE) ENGINE=INNODB;
insert into table1 (data1) values ('row1');
insert into table1 (data1) values ('row2');
insert into table2 (table1_id, data1) values (1,'row21');
insert into table2 (table1_id, data1) values (2,'row22');
insert into table2 (table1_id, data1) values (2,'row23');
DELIMITER //
CREATE TRIGGER t1_t2
AFTER DELETE ON table2
FOR EACH ROW BEGIN
delete from table1 where id = old.table1_id;
END;
//
DELIMITER ;
select * from table1;
select * from table2;
delete from table2 where id=2;
select * from table1;
select * from table2;
drop table table2;
drop table table1;