本帖最后由 yonghumingbuzhidao 于 2012-11-26 11:36:01 编辑 坛子里的朋友们,我碰到一个这样的问题
我有三个表的,如结构如下:
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`gid` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `gid` (`gid`),
CONSTRAINT `FK_GID` FOREIGN KEY (`gid`) REFERENCES `grade` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Table structure for grade
-- ----------------------------
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` varchar(10) DEFAULT NULL,
`cid` bigint(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `FK_CID` (`cid`),
CONSTRAINT `FK_CID` FOREIGN KEY (`cid`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
我分别开两个事务
session 1:
mysql> set autocommit=0;
session 2:
mysql> set autocommit=0;
session 1:
mysql> delete student from student inner join class on student.cid=class.id where class.gid=2;
session 2:
insert into class(name,gid) values('calss4',1);
此时,session 2 的insert操作,没有立刻执行,而是处于等待状态。
session 1:
mysql> commit;
执行完seesion1的commit操作后,session2的insert 也生效执行了.
session 2:
mysql> commit;
我的问题是,再session 1 执行
delete.. from.. inner join...操作时,是不是class 表在锁表?依这种情况来看,是锁表现象。 那么如果真的锁表了,有没有什么方法能够避免这种锁表呢?
我想到的解决方法是将
select id from class where class.gid=2查出来的数据,放入临时表temp_table中,然后
delete student from student inner join temp_table on student.cid=temp_table.id;这样可以不锁 class 表。有没有更好的方法呢?或者说我这个思路来就就是错的。请大家给我点建议,感激感激!
------最佳解决方案--------------------
MySql 的建议去MySql 专区问下
------其他解决方案--------------------
感觉insert是不会被阻塞的。