【问题标题】:concurrent SQL statements in different transanctions不同事务中的并发 SQL 语句
【发布时间】:2017-06-04 11:57:17
【问题描述】:

阅读ORACLE中PL-SQL CREATE TRIGGER语句的documentation,我浏览了以下信息:

当触发器触发时,触发器引用的表可能是 正在经历其他用户的 SQL 语句所做的更改 交易。在触发器中运行的 SQL 语句遵循相同的规则 独立的 SQL 语句。

它基本上说,当从触发器中执行其中一个语句时,适用于两个冲突的独立 SQL 语句(同时运行)的规则不会改变。

所以我们有一些关于并发事务的“常规”规则,对于这些规则,提到了以下两个:

具体来说:

在触发器中查询看到当前读一致物化 引用表的视图以及在同一表中更改的任何数据 交易。

触发器中的更新等待现有数据锁被释放 在继续之前。

这两条规则对于非专业用户来说似乎“晦涩难懂”。

更准确地说是什么意思?

【问题讨论】:

  • 问题设置公平,问题公平。但是,这不是获得答案的正确位置。该站点(堆栈溢出)是针对特定编程问题的。了解 Oracle 如何在多用户环境中处理事务(如数据锁、读取一致性视图等)的地方是 Oracle 文档,其中解释得非常清楚并带有很好的示例 - 或任何有关 Oracle 的书数据库。

标签: sql oracle plsql triggers transactions


【解决方案1】:

在触发器中查询看到当前读一致物化 引用表的视图以及在同一表中更改的任何数据 交易。

这意味着触发器看到的数据,就像它在不同的表上执行SELECT 一样,表示语句开始运行时该表的状态。触发器看不到由尚未提交的其他会话更改的行。

触发器中的更新等待现有数据锁被释放 在继续之前。

当 Oracle 语句修改一行时,该行将被锁定以防止其他人更改它,直到该会话提交或回滚其事务。因此,如果您在表 A 上执行插入操作,您的触发器会在表 B 上进行更新,但其他人的会话已经对表 B 进行了更新对于同一行,您的事务将等待直到他们提交或回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多