首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于一个MySql 删除的有关问题

2012-12-15 
关于一个MySql 删除的问题本帖最后由 yonghumingbuzhidao 于 2012-11-26 11:36:01 编辑坛子里的朋友们,我

关于一个MySql 删除的问题
本帖最后由 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是不会被阻塞的。

热点排行