在Oracle中使用FK时查询FOR UPDATE NOWAIT

海纳迪格

我有一个表tab1 (t_id, status)tab2 (id, t_id, status)其中t_id.tab2有外键引用tab1.t_id

S1获取承担Oracle会话SELECT FOR UPDATE NOWAIT中的记录锁定tab1t_id=123

NOWAITs1仍然保持锁定时tab1,另一个会话s2是否可以tab2tab2.t_id=123(FK)更新记录

米克助记符

正如注释中所指出的那样,用locking readSELECT ... FOR UPDATE)语句发出的行锁不会传播到声明的子表中FOREIGN KEY

这是一个演示此的示例:

-- Set up schema
CREATE TABLE tab1 (t_id NUMBER(10), status VARCHAR2(10), PRIMARY KEY (t_id));
CREATE TABLE tab2 (id NUMBER(10), t_id NUMBER(10), status VARCHAR2(10), 
                  PRIMARY KEY (id),
                  CONSTRAINT fk_tab1 FOREIGN KEY (t_id) REFERENCES tab1 (t_id));
INSERT INTO tab1 (t_id, status) VALUES (123, 'Status1');
INSERT INTO tab1 (t_id, status) VALUES (234, 'Status1');
INSERT INTO tab2 (id, t_id, status) VALUES (1, 123, 'Status2');
INSERT INTO tab2 (id, t_id, status) VALUES (2, 234, 'Status2');
COMMIT;

以下脚本使用该AUTONOMOUS_TRANSACTION实用程序来发出新事务,该脚本成功执行(例如在Oracle SQLDeveloper中):

SET autocommit 0;
SELECT * FROM tab1 WHERE t_id=123 FOR UPDATE NOWAIT;
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  UPDATE tab1 SET status = 'Status2' WHERE t_id = 234;
  UPDATE tab2 SET t_id = 234, status = 'Status2' WHERE t_id = 123;
  COMMIT;
END;

因此,可以更改中的其他行tab1以及tab2指向中的锁定行的外键列tab1

如预期的那样,尝试更新锁定的行:

SELECT * FROM tab1 WHERE t_id=123 FOR UPDATE NOWAIT;
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  UPDATE tab1 SET status = 'Status2' WHERE t_id = 123;
  COMMIT;
END;

...将失败并显示错误消息:

ORA-00060:等待资源时检测到死锁

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在多线程环境中使用select for update nowait时,只读结果集的操作无效

来自分类Dev

在多线程环境中使用select for update nowait时,只读结果集的操作无效

来自分类Dev

FOR UPDATE NOWAIT不起作用

来自分类Dev

Oracle 12c:在不相交的行集上并行 SELECT FOR UPDATE NOWAIT 导致 ORA-00054:资源繁忙

来自分类Dev

在python中使用get_nowait()而不引发空异常

来自分类Dev

在python中使用get_nowait()而不引发空异常

来自分类Dev

为什么要同时使用NOLOCK和NOWAIT?

来自分类Dev

为什么要同时使用NOLOCK和NOWAIT?

来自分类Dev

在JOOQ中使用NOWAIT和SKIP LOCKED子句的解决方法

来自分类Dev

在JOOQ中使用NOWAIT和SKIP LOCKED子句的解决方法

来自分类Dev

OpenMP并行nowait

来自分类Dev

在UPDATE查询中使用JOIN

来自分类Dev

无法使用sysdate执行UPDATE查询-ORACLE

来自分类Dev

在 UPDATE 查询中使用 INTERSECT 时出现 SQL 语法错误

来自分类Dev

使用Equijoin的UPDATE查询

来自分类Dev

在一个查询中使用INSERT,SELECT和UPDATE?

来自分类Dev

如何在函数中使用查询结果执行UPDATE

来自分类Dev

在1个查询中使用INSERT SELECT和UPDATE。是对的吗?

来自分类Dev

在 UPDATE 查询中使用 IN 子句的语法错误

来自分类Dev

Oracle Update查询无法使用C#更新

来自分类Dev

使用变量查询时,UPDATE TABLE 返回空值

来自分类Dev

什么使blk_execute_rq_nowait排队的请求出队

来自分类Dev

在$ wpdb类中使用update()时发生致命错误

来自分类Dev

使用JOIN的SQL UPDATE查询

来自分类Dev

使用Equijoin进行UPDATE查询

来自分类Dev

使用SubQuery的MySQL UPDATE查询

来自分类Dev

在MySQL中使用多个UPDATE

来自分类Dev

使用猫鼬.update查询时,可以在update参数中引用获取的记录吗?

来自分类Dev

在使用PHP的MYSQL UPDATE查询中使用两个where子句

Related 相关文章

  1. 1

    在多线程环境中使用select for update nowait时,只读结果集的操作无效

  2. 2

    在多线程环境中使用select for update nowait时,只读结果集的操作无效

  3. 3

    FOR UPDATE NOWAIT不起作用

  4. 4

    Oracle 12c:在不相交的行集上并行 SELECT FOR UPDATE NOWAIT 导致 ORA-00054:资源繁忙

  5. 5

    在python中使用get_nowait()而不引发空异常

  6. 6

    在python中使用get_nowait()而不引发空异常

  7. 7

    为什么要同时使用NOLOCK和NOWAIT?

  8. 8

    为什么要同时使用NOLOCK和NOWAIT?

  9. 9

    在JOOQ中使用NOWAIT和SKIP LOCKED子句的解决方法

  10. 10

    在JOOQ中使用NOWAIT和SKIP LOCKED子句的解决方法

  11. 11

    OpenMP并行nowait

  12. 12

    在UPDATE查询中使用JOIN

  13. 13

    无法使用sysdate执行UPDATE查询-ORACLE

  14. 14

    在 UPDATE 查询中使用 INTERSECT 时出现 SQL 语法错误

  15. 15

    使用Equijoin的UPDATE查询

  16. 16

    在一个查询中使用INSERT,SELECT和UPDATE?

  17. 17

    如何在函数中使用查询结果执行UPDATE

  18. 18

    在1个查询中使用INSERT SELECT和UPDATE。是对的吗?

  19. 19

    在 UPDATE 查询中使用 IN 子句的语法错误

  20. 20

    Oracle Update查询无法使用C#更新

  21. 21

    使用变量查询时,UPDATE TABLE 返回空值

  22. 22

    什么使blk_execute_rq_nowait排队的请求出队

  23. 23

    在$ wpdb类中使用update()时发生致命错误

  24. 24

    使用JOIN的SQL UPDATE查询

  25. 25

    使用Equijoin进行UPDATE查询

  26. 26

    使用SubQuery的MySQL UPDATE查询

  27. 27

    在MySQL中使用多个UPDATE

  28. 28

    使用猫鼬.update查询时,可以在update参数中引用获取的记录吗?

  29. 29

    在使用PHP的MYSQL UPDATE查询中使用两个where子句

热门标签

归档