如何在具有简单的4列(SNO,NAME,JOB,部门)的表上的甲骨文中创建僵局



我想在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

最新更新