复合主键(外键+主键)是否需要索引以避免死锁?
示例场景:一对多的关系(一个员工可以在多个部门工作)
父表:Employe1.EmployeeID(主键) 2.Name
子表: Department (复合主键-> (Idx + Employee ID) 1.Idx(主键)2.部门名称3.Employee ID(主键)
类Employee { int Employee ID;字符串名称;列出部门;}
类部门{ String departmentName;}
<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>发布于 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 table的WAITING,那么您可以理解:
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:
CREATE INDEX emp_dept_id_idx ON emp (dept_id);再试:
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
https://dba.stackexchange.com/questions/183164
复制相似问题