如何将使用事务的代码包装在事务中然后回滚?

2024-01-20

我正在设置我的集成测试设备。我正在使用beforeEach and afterEach挂钩将每个测试包装在回滚的事务中,以便测试不会相互影响。一个简化的例子可能是这样的:

const { repository } = require("library")

describe("Suite", function () {
  beforeEach(async function () {
    await knex.raw("BEGIN");
  });

  afterEach(async function () {
    await knex.raw("ROLLBACK");
  });

  it("A test", async function () {
    const user = await repository.createUser()
    user.id.should.equal(1)
  });
});

这工作得很好,因为我将 knex 配置为使用单个数据库连接进行测试。因此调用knex.raw("BEGIN");创建了一个global交易。

然而现在,我无法控制的图书馆的存储库开始在内部使用事务。 IE。createUser()开始然后commits创建的用户。这打破了我的测试,就像现在我的afterEachhook 不会回滚更改,因为它们已经提交。

Postgres 中有没有办法回滚具有(已提交)嵌套事务的事务?

或者也许有一种方法可以使用 knex 来阻止存储库首先启动事务?它用knex.transaction()创建它们。

Thanks!


从外表来看调试日志示例 https://github.com/knex/knex/issues/3389#issuecomment-519811122,knex 实际上会自动检测事务嵌套,并将嵌套事务从使用不可逆commit/rollback to 易于管理的 https://www.postgresql.org/docs/current/sql-savepoint.html savepoint s1/release s1/rollback to s1就像我猜测的那样我的评论 https://stackoverflow.com/questions/74387244/how-to-wrap-code-that-uses-transcations-in-a-transaction-and-then-rollback#comment131502339_74387244.

在这种情况下,您应该足以将调用包装在事务中,以便您“拥有”顶级事务。 Knex 应该检测到这一点并强制底层事务使用保存点而不是提交,然后您可以撤消所有这些操作,回滚顶级事务。如果我读the doc https://knexjs.org/guide/transactions.html right:

const { repository } = require("library")
 
describe("Suite", function () {
  it("A test", async function () {
    try {
        await knex.transaction(async trx => {
          const user = await repository.createUser();
          user.id.should.equal(1);
          trx.rollback();
        })
    } catch (error) {
      console.error(error);
    }
  });
});

假设下面的调用都没有发出knex.raw("COMMIT")或以某种方式调用.commit()在外部、顶级交易上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将使用事务的代码包装在事务中然后回滚? 的相关文章

  • 如何检索 jquery $.ajax 对象的responseJSON属性[重复]

    这个问题在这里已经有答案了 我有这个 JavaScript ajax ajax type GET url DBConnect php data dataType json success function data error functi
  • 从字符串中删除货币符号并使用 Javascript 中的单行转换为数字

    我下面有一个字符串 它是以英镑为单位的价格 我想删除货币符号 然后将其转换为我可以用来与另一个值进行比较的数字 价格 例如 X gt Y 14 50 我之前已将字符串转换为用于货币的数字 var priceNum parseFloat pr
  • javascript获取上周的第一天和最后一天[重复]

    这个问题在这里已经有答案了 我想用 javascript 获取上周的第一天 星期一 和最后一天 星期日 我已经检查过其他主题 但它不起作用 我还需要处理前一周是否是两个不同的月份 我正在使用此代码 但最后一个星期日是 06 03 2014
  • Jquery 动画与 CSS 浮动

    我的代码有问题 宽度似乎可以工作 但浮动没有 这里是 这是一个例子 http jsfiddle net v82ck http jsfiddle net v82ck 问题 悬停时菜单上的浮动属性不会改变 我希望每个菜单元素下方的线在悬停该菜单
  • 对 JavaScript 中的 while 循环感到困惑

    我可能在这里有点厚重 但请回答我这个问题 考虑以下代码 a 1 while a lt 6 console log a a 如果我运行这个 我会在控制台中得到从 1 到 6 的值 然后是另一个 6 现在看看这个 a 1 while a lt
  • Atom“自动完成”不起作用

    因此 当您安装 Atom 时 autocomplete 会随其一起提供 并且默认情况下处于启用状态 当我编写代码时 什么也没有显示 为什么 是否需要配置任何文件才能正常工作 In autocomplete plus settings pag
  • Angular 2 最终版本路由器单元测试

    如何使用 karma 和 jasmine 对 Angular 2 0 0 版中的路由器进行单元测试 这是我的旧单元测试在版本 2 0 0 beta 14 中的样子 import it inject injectAsync beforeEac
  • 嵌套对象的 AJV 模式验证

    函数返回的对象看起来像这样 answer vehicle type 1 message Car model VW color red 答案 对象始终存在 其他字段基于 vehicle type E g 如果vehicle type 1 则有
  • 按自定义字母顺序对数组进行排序

    如何对这样的数组进行排序 apple very auto tom tim violet 要按 v a t x b 等排序 不按字母顺序 violet very auto tom tim 在脚本中 我会做这样的事情 myArray sort
  • 向 FTP 服务器执行跨域 XMLHTTPREQUEST 的语法是什么?

    我有一个 webDav CORS 插件 可以使用它在 webDav 服务器上 POST PUT GET REMOVE ALLDOCS 文件 我现在想对 FTP 做同样的事情 但我正在努力获取xmlhttprequest 工作语法 我只是收到
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • 在 Chrome 中检索浏览器语言

    我一直在尝试让 momentjs 正确检测浏览器语言并本地化时间显示 按照使用 Moment js 进行区域设置检测 https stackoverflow com questions 25725882 locale detection w
  • 当脚本是从加载的脚本动态创建的 DOM 节点时,脚本 onload 和 window.onload 的顺序是否定义良好?

    File loader js function main if typeof window undefined var script window document createElement script script src https
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 单击窗口后才检测到 keydown

    在我的 Web 应用程序中 我有一个用于打开菜单的键的事件侦听器 仅当我单击页面上的任意位置后 此功能才可以正常工作 我尝试将焦点添加到窗口加载 但这仍然不会让 keydown 函数运行 直到我单击页面上的某个位置之后 有谁知道这是否可能
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • 如何在 svelte 中制作搜索过滤器

    我有两个组件在组件树中距离很远 我对如何在两者之间进行通信存有疑问 我有搜索组件 listItems 和商店 商店 svelte
  • Safari 的 Javascript 与 document.write 的问题

    我的问题只发生在 Safari 上 IE FF Chrome 和 Opera 都可以完美运行 我正在向 DOM 添加一个对象 与 YouTube 的方式完全相同 具体取决于 ActiveX 或 NPAPI 因此在确定写入对象类型后 我通过以
  • 禁用 Materialise Carousel 上的触摸

    看起来以前没有人问过这个问题 因为我几乎在互联网上寻找一个非常简单的答案 如何禁用在物化轮播上向左 向右滑动的功能 在 Materialize js 添加 编辑 var allowCarouselDrag true value functi
  • 截断段落前 100 个字符并隐藏段落的其余内容,以通过更多/更少链接显示/隐藏其余内容

    我有一个超过 500 个字符的段落 我只想获取最初的 100 个字符并隐藏其余部分 我还想在 100 个字符旁边插入 更多 链接 单击更多链接时 整个段落应显示并编辑文本 更多 到 更少 单击 更少 时 它应切换行为 段落是动态生成的 我无

随机推荐

  • Checkstyle - 仅检查接口中的方法

    是否可以仅对接口中的方法应用 JavadocMethod 检查器 不在实现类中 我们也有计划实施 敬请关注issue https github com sevntu checkstyle sevntu checkstyle issues 7
  • CDK将API网关堆栈分成2个小堆栈

    我正在尝试创建一个 CDK 堆栈来创建 API 网关 如果我以 小块 形式创建堆栈 资源的注释部分 则一切都会正常工作 但是当我尝试创建完整的堆栈时 我收到此异常 Number of resources 224 is greater tha
  • 为 Mac 编译 stasm

    我正在尝试在我的 mac 上构建 stasm 库 并希望将其移植到 iphone 上 斯塔姆下载 http www milbo users sonic net stasm download html http www milbo users
  • 使用 Eclipse Juno Java EE 进行 jQuery 自动补全

    我已经阅读了一些关于如何为 Eclipse 启用 jQuery 特别是自动完成 支持的日期信息 使用 Aptana 或其他插件 我尝试过 Aptana 3 版本插件 但除了问题之外什么也没得到 有人可以解释如何实现这一目标吗 也许现在 Ap
  • PageControl 禁用选项卡上的文本 - 灰色文本

    我正在寻找 我认为 可以在 TPageControl 组件的 OnDrawTab 事件中使用的 Windows API 以在我选择的选项卡上显示灰色文本 我过去曾经这样做过 根据记忆 这就是我所做的 在 OnDrawTab 事件中 不幸的是
  • 有没有办法对 Firebase 用户创建和/或密码重置进行电子邮件确认?

    问题说明了一切 在 Firebase 中 当用户创建帐户时如何确认电子邮件 或者通过电子邮件重置密码 我可以更广泛地问 有什么方法可以从 Firebase 发送电子邮件吗 例如 通知等 这不是您通常在客户端执行的操作 Update 请注意
  • 在 Visual Studio 2010 中更改文本光标/插入符号

    我不小心将 Visual Studio 2010 中的文本光标 插入符号从一行更改为带有突出显示整个字符的框的光标 但不知道如何将其更改回来 谁能告诉我怎么做 谢谢 按插入键
  • 如何将可观察集合写入txt文件?

    将可观察集合写入 txt 文件的最佳方法是什么 我目前有以下内容 public ObservableCollection
  • pytqt图形线的鼠标坐标

    每当我将鼠标移动到图表顶部时 我都试图获取随机函数图的 x y 值 我正在使用 pyqtgraph SignalProxy 并将其连接到回调 mousedMoved 我收到此错误 NameError 未定义全局名称 mouseMoved 这
  • 在 Play 2.x 中覆盖 WebJar 资源

    只是想知道 是否有一种方法可以在一个文件中覆盖某些资产 确切地说是 JS 和 LESS 文件WebJars http www webjars org 资产与位于app assets 目录 说吧 我有一个引导程序 3 1 1 webjar h
  • 将 Matplotlib 图形保存为全屏图像

    我正在使用 Pandas 和 MatPlotLib 构建一个小型图形实用程序来解析工作机器中的数据和输出图形 当我使用输出图表时 plt show 我最终得到了一个不清晰的图像 其中的图例和标签就像这样相互排斥 However expand
  • 无法使用 pip 安装 Python 成像库

    尝试使用 PIP 安装 Python Imaging Library PIL 时 安装失败并出现以下错误 SyntaxError invalid syntax Complete output from command python setu
  • 没有找到类“androidx.core.widget.DrawerLayout”

    使用 Android Studio 菜单选项 Refactor gt Refactor to Androidx 迁移到 Androidx 包后 我的 build gradle 看起来像 implementation androidx app
  • facebook graph api 和 php sdk,删除事件!

    在我的一生中 我找不到一种方法来删除 取消或移除我使用 FB PHP SDK 和 Graph API 创建和更新的 Facebook 事件 我已经尝试了 facebook 文档和堆栈溢出中找到的每一个排列 以下是我在探索中发现的一些线索 h
  • 适合初学者的松耦合和面向对象实践

    保持类松散耦合是编写易于理解 修改和调试的代码的一个重要方面 我明白了 然而 作为一个新手 几乎任何时候我都很难超越最简单的例子 我或多或少地了解如何将字符串 整数和简单数据类型封装在它们自己的类中 然而 当我开始处理富文本格式等信息时 事
  • 在Linux上安装特定的adb版本

    我想使用特定的 adb 版本来连接设备 为了连接外部模拟器 我尝试使用adb connect localhost 5555 我得到这个结果 adb adb server version 36 doesn t match this clien
  • 如何在 Asp.Net Core 2.2 中禁用/启用运行时身份验证?

    网站默认只能匿名访问 管理员有一个按钮可以将站点切换到维护模式 这应该使用内置的 Cookie 身份验证启用授权 在数据库中稍微翻转一下 与本文无关 为了实现这一点 我首先配置了 cookie 身份验证 在startup cs中 publi
  • 如何在 MVC 3 中的 PartialView 加载上执行 JavaScript 函数

    code public ActionResult mapPartial DataTable dt string strEvents foreach DataRow row in dt Rows strEvents row Lat ToStr
  • dijit.byId 不适用于 IE8 和 dojo.addOnLoad

    当我使用 IE8 加载此脚本时 出现异常Object does not support this property or method 但它适用于其他浏览器 我用的是dijit 1 3 1 我不明白 dojo addOnLoad init
  • 如何将使用事务的代码包装在事务中然后回滚?

    我正在设置我的集成测试设备 我正在使用beforeEach and afterEach挂钩将每个测试包装在回滚的事务中 以便测试不会相互影响 一个简化的例子可能是这样的 const repository require library de