暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 默认列值vs提交写批处理noait当实际值被分配时?

askTom 2017-04-06
269

问题描述

嗨,汤姆,

In this section I'll explain how I come up with the question..

在正常操作下,我们的应用程序执行以下操作:
1.调用util.do_some_action,但不等待响应
2.做一些远程系统的网络调用
3.接收来自util.do_some_action的响应,并将操作标记为已保存
4.接收来自步骤2的响应,如果操作未标记为已保存,则调用util.do_some_action。

如果步骤4在步骤3之前完成,则将有2个调用util.do_some_action。
应用程序可以处理它,但我注意到有时log_messages表中的两个日志条目都具有相同的create_dt。
这没有意义,因为两次通话之间有明显的延迟。

question

我们的应用程序将日志保存到log_messages表中,期望create_dt字段代表我们调用util.save_log的时间
但是有时create_dt的值对于顺序调用可能是相同的,它们之间有一些延迟。

我有一个猜测,提交写批处理NOWAIT将缓冲 (批处理!) 事务,并在以后的某个时间将值分配给create_dt。
这是正确的吗?






专家解答

不,CREATE_DT将在调用时分配 (例如插入),而不是在提交时分配。

但是,这并不意味着如果任何一个条目的提交延迟,您都会同时 * 看到 * 这些条目。

例如

SQL> create table t ( x date );

Table created.

SQL>
SQL> b例如in
  2    insert into t values (sysdate);
  3    commit;
  4    insert into t values (sysdate);
  5  end;
  6  /

PL/SQL procedure successfully completed.

--
-- From another session
--

SQL> select * from t;

X
-------------------
07/04/2017 13:32:20


所以我看不到第二行,直到 “稍后”... 当会话1提交时,我看到了这个:

SQL> select * from t;

X
-------------------
07/04/2017 13:32:20
07/04/2017 13:32:20



因此,该日期同时应用,但该行的 “外观” 出现延迟 (因为它是未提交的)。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论