御风御吾 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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)