首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle死锁

Oracle死锁
EN

Database Administration用户
提问于 2017-08-10 11:26:57
回答 1查看 129关注 0票数 0

复合主键(外键+主键)是否需要索引以避免死锁?

示例场景:一对多的关系(一个员工可以在多个部门工作)

父表:Employe1.EmployeeID(主键) 2.Name

子表: Department (复合主键-> (Idx + Employee ID) 1.Idx(主键)2.部门名称3.Employee ID(主键)

类Employee { int Employee ID;字符串名称;列出部门;}

类部门{ String departmentName;}

代码语言:javascript
复制
<list cascade="all,delete-orphan" name="ListOfDepartment" table="Department">
        <key column="Employee ID" />
        <index column="idx"/>
        <composite-element class="Department">
            <property name="departmentName" column="departmentName" not-null="true" />
        </composite-element>
</list>
EN

回答 1

Database Administration用户

发布于 2017-08-12 19:25:01

1)对Deadlock的一个小描述:这是两个会话相互阻塞的情况,因此两者都不能做任何事情。死锁由DIA0后台进程自动检测和解析。

2) Deadlocks are not the DBA’s problem,它们是由程序设计错误引起的,并由数据库本身自动解析。

3)它们之所以出现,是因为代码试图做一些逻辑上不可能的事情。编写良好的代码总是以不会导致死锁发生的顺序请求锁,或者在请求之前测试不兼容锁是否已经存在。

因此,you do not need考虑为您的表创建一个Index,仅仅是因为avoiding deadlocks。最好是让你的程序设计者写一个好的代码。

但是,如果您认为可能有一些错误的代码(最好是修复它们),或者您不希望等待Parent table,那么CREATE INDEX用于您的FOREIGN KEY COLUMN,因为如果您不这样做,那么当一些DML进程在Child table中进行时,您将得到Parent tableWAITING,那么您可以理解:

代码语言:javascript
复制
        CREATE TABLE dept (
        dept_id NUMBER PRIMARY KEY,
        dept_name VARCHAR2(25)
        );

        CREATE TABLE emp (
        emp_id NUMBER PRIMARY KEY,
        emp_name VARCHAR2 (25),
        dept_id NUMBER REFERENCES dept (dept_id)
        );

        INSERT INTO dept VALUES (10, 'IT');
        INSERT INTO dept VALUES (20, 'Market');
        COMMIT;

    SESSION1: INSERT INTO emp VALUES (1, 'Alex', 10);
    SESSION2: DELETE FROM dept WHERE dept_id = 20; --- different dept_id, not the same with SESSION1 data

RESULT: Here you get `THE LOCK`, so `SESSION2 waiting` FOR `SESSION1 COMMIT`;

现在,我们将对CREATE an INDEX表进行FK ON emp

代码语言:javascript
复制
CREATE INDEX emp_dept_id_idx ON emp (dept_id);

再试:

代码语言:javascript
复制
SESSION1: INSERT INTO emp VALUES (1, 'Alex', 10);
SESSION2: DELETE FROM dept WHERE dept_id = 20;

RESULT: Now NO WAITING, because the `Parent table` do not need to do `full table` scan and `LOCK whole table`;

书籍: OCA-OCP 11g全合一(死锁);详细信息:http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyteunindex.html

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/183164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档