sequelize的transaction事务是否能监听rollback?

发布于 2022-09-12 02:59:05 字数 911 浏览 13 评论 0

项目中通过劫持sequelize的几个方法update、destroy、save进行缓存处理。
但是遇到了开启transactionrollback就数据不同步的情况,数据库rollback了,但是缓存生效了。

await sequelize.transaction(async function (transaction) {
    // 请问是否可以通过这个 transaction 对象监听到`rollback`?
});

下面是我处理缓存的简单例子,这情况下只能寄希望能通过transaction这个对象有钩子处理了

import Sequelize from 'sequelize';

const {Model} = Sequelize;

const _save = Model.prototype.save;

Model.prototype.save = async function (options) {
  const instance = this;
  const model = instance.__proto__.constructor;
  // 执行原始方法
  const result = await _save(options);
  // 记录缓存
  _cacheSave(model, instance);

  if (options && options.transaction) {
    // 现在的问题就是遇到这个options.transaction被rollback不知道 上面 _cacheSave 已经执行 缓存生效了
    console.log(options.transaction);
  }

  return result;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

究竟谁懂我的在乎 2022-09-19 02:59:05

解决了,测试后发现原生只有提供afterCommittransaction对象上可以通过下面的方式挂载钩子

transaction._afterCommitHooks.push(() => {
    // afterCommit
});

但是这个钩子只能监听到commit不能监听rollback;
然后换个思路既然transaction是对象,可以自己在上面设钩子啊

await sequelize.transaction(async function (transaction) {
  const afterRollbackHooks = [];
  transaction.afterRollback = hook => {
    typeof hook === 'function' && afterRollbackHooks.push(hook);
  };
  try {
    
    // 原来要处理的代码
    
  } catch (err) {
    if (afterRollbackHooks.length) {
      for (const hook of afterRollbackHooks) {
        hook(transaction);
      }
    }
    throw err;
  }
});

在劫持方法内监听钩子

if (options && options.transaction) {
  options.transaction.afterRollback(() => {
    _cacheDestroyByInstance(instance);
  });
}

解决了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文