我想在Oracle表中创建一个僵局,该状况不会给出响应,并且会在Java应用程序中执行相同的查询吗?您能提供一个示例查询表上的情况(有4列SNO,名称,作业,部门)。
在会话1:
中DECLARE
v_row1 TABLE_NAME%ROWTYPE;
v_row2 TABLE_NAME%ROWTYPE;
BEGIN
SELECT *
INTO v_row1
FROM table_name
WHERE sno = 1
FOR UPDATE;
DBMS_LOCK.SLEEP( seconds => 5 );
SELECT *
INTO v_row2
FROM table_name
WHERE sno = 2
FOR UPDATE;
ROLLBACK;
END;
/
然后在会议2中:
DECLARE
v_row1 TABLE_NAME%ROWTYPE;
v_row2 TABLE_NAME%ROWTYPE;
BEGIN
SELECT *
INTO v_row2
FROM table_name
WHERE sno = 2
FOR UPDATE;
DBMS_LOCK.SLEEP( seconds => 5 );
SELECT *
INTO v_row1
FROM table_name
WHERE sno = 1
FOR UPDATE;
ROLLBACK;
END;
/
当两个或多个会话正在等待彼此锁定的数据时,就会发生僵局,从而导致所有被阻止的会话。通常,僵局是由于在应用程序代码中锁定的锁定或性能问题或由于DB上两个不同的过程处理数据之间的冲突而引起的。
。参考:https://oracle-base.com/articles/misc/deadlocks