专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

ORACLE联合索引导并发情况下造成死锁

ins518 2024-11-01 13:22:16 技术文章 13 ℃ 0 评论

今天线上DBA反馈了一个死锁的问题,最终通过定位发现是因为一张表存在一个唯一联合索引导致的,所以记录下,希望能帮到大家。


  • 模拟场景:

表中存放用户和用户老师的关联关系,一条记录就是一位用户的老师,所以用户和老师的关系不能出现重复。


  • 创建一个存在联合索引的表 T_UNION_INDEX_TEST
CREATE TABLE T_USER_TEACHER
(
    ID          NUMBER       NOT NULL PRIMARY KEY,
    NAME        VARCHAR2(16) NOT NULL,
    TEACHER     VARCHAR2(16) NOT NULL,
    CREATE_TIME date default sysdate
);
  • 创建NAMETEACHER的联合索引
CREATE UNIQUE INDEX IDX_USER_TEACHER_01 ON T_USER_TEACHER (NAME, TEACHER);
  • 线程1(会话1)插入数据
INSERT INTO T_USER_TEACHER (ID, NAME, TEACHER)
values (1, '张三', '王老师');
  • 此时切换到线程2(会话2)插入数据
INSERT INTO T_USER_TEACHER (ID, NAME, TEACHER)
values (3, '张三', '李老师');

INSERT INTO T_USER_TEACHER (ID, NAME, TEACHER)
values (4, '张三', '王老师');

此时此线程会一直等待,因为现在联合索引的锁在线程1上。

  • 线程2执行完上述两条insert后又切换回线程1继续执行
INSERT INTO T_USER_TEACHER (ID, NAME, TEACHER)
values (2, '张三', '李老师');

commit;

此时线程1执行commit,会提示死锁异常。


而此时线程2会一直被挂起,除非应用关闭或数据手动杀死会话,不然无法释放。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表