御风御吾 2020-01-17 17:10 采纳率: 0%
浏览 336

mysql两个事务锁等待是怎么形成的?

-- version mysql 5.7.20

-- 数据准备【数据库隔离级别为默然RR级别】
CREATE TABLE `employee` (
  `id` int(11) NOT NULL COMMENT 'id',
  `deptNo` int(11) NOT NULL COMMENT '部门编号',
  `name` varchar(200) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`deptNo`,`id`),
  UNIQUE KEY `employee_id_uindex` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';

INSERT INTO employee (id,deptNo,name) value (1,1000,'小明');



-- 事务1
START TRANSACTION ;
DELETE FROM employee WHERE deptNo = 1001;
INSERT INTO employee (id,deptNo,name) value (2,1001,'张三');
ROLLBACK ;

-- 事务2
START TRANSACTION ;
DELETE FROM employee WHERE deptNo = 1002;
INSERT INTO employee (id,deptNo,name) value (3,1002,'李四');
ROLLBACK ;


-- 问题:执行事务1,然后执行事务2,此时事务2锁等待,请大神给详细解答一下,跪谢!!!
  • 写回答

1条回答

  • 憧憬blog 2023-03-15 03:26
    关注

    根据你提供的代码,事务1和事务2都涉及对employee表进行删除和插入操作。在默认的隔离级别下(即Repeatable Read),这意味着两个事务在执行期间都将锁定employee表。不过,在事务1中删除了deptNo为1001的记录,这可能会引发锁等待问题。假设事务2要删除deptNo为1002的记录,它需要获取一个锁,但由于事务1已经锁定了整个表,事务2必须等待事务1释放锁。因此,事务2将进入锁等待状态。只有当事务1释放了锁并提交了事务后,事务2才能继续执行。

    要解决这个问题,可以将隔离级别改为Read Commited,这将减少锁的粒度并减少锁等待的可能性。另一种方法是使用NOLOCK和READUNCOMMITTED提示在事务中执行SELECT查询,以避免对表进行锁定。虽然这些提示可以减少锁等待时间,但它们也可能导致数据不一致的问题。因此,在使用它们之前请务必认真考虑。

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题