【问题标题】:How can I SELECT uncommitted records within the same transaction?如何在同一事务中选择未提交的记录?
【发布时间】:2022-09-28 18:46:36
【问题描述】:

我在 Sveltekit 上使用带有 TypeORM 的 OracleDB。

我想选择在同一事务中提交之前更新的记录。但是,无论事务ISOLATION LEVEL 设置为SERIALIZABLE 还是READ COMMITTED,SELECT 可以检索到的记录都将是旧记录。

SELECT 在 TypeORM 的 SQL 日志中的 UPDATE 之后立即运行。
如果我在更新后进行显式提交,我可以正确选择。
如何检索最后的书面记录?

(9月28日编辑)看来我的帖子错了。很抱歉。
使用 .Net Core 6 + C# 10 + Oracle,我能够在提交之前更新记录和选择以获取更新的记录。
但是,使用 node.js + Sveltekit + TypeORM,即使我做了和上面一样的事情,我也得到了更新前的旧记录。
我想在 node.js 端以相同的方式选择新记录。

标签: sql oracle typeorm


【解决方案1】:

不要尝试从第三方应用程序执行此操作。

使用 PL/SQL 并在一个块中完成所有操作:

DECLARE
  v_ids SYS.ODCINUMBERLIST;
BEGIN
  UPDATE table_name
  SET    value = 'something'
  WHERE  other = 'something else'
  RETURNING id BULK COLLECT INTO v_ids;

  OPEN :your_cursor FOR
    SELECT *
    FROM   table_name
    WHERE  id IN (SELECT COLUMN_VALUE FROM TABLE(v_ids));
END;
/

如果需要,可以将其包装在一个过程中:

CREATE PROCEDURE update_table_name(
  i_new_value IN  TABLE_NAME.VALUE%TYPE,
  i_other     IN  TABLE_NAME.OTHER%TYPE,
  o_cursor    OUT SYS_REFCURSOR
)
IS
  v_ids SYS.ODCINUMBERLIST;
BEGIN
  UPDATE table_name
  SET    value = i_new_value
  WHERE  other = i_other
  RETURNING id BULK COLLECT INTO v_ids;

  OPEN o_cursor FOR
    SELECT *
    FROM   table_name
    WHERE  id IN (SELECT COLUMN_VALUE FROM TABLE(v_ids));
END;
/

然后从 TypeORM 调用该过程。

fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2017-06-17
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多