Egg.js中使用sequelize事務(wù)

對(duì)數(shù)據(jù)庫(kù)的操作很多時(shí)候需要同時(shí)進(jìn)行幾個(gè)操作,比如需要同時(shí)改動(dòng)幾張表的數(shù)據(jù),或者對(duì)同一張表中不同行(row)或列(column)做不同操作,比較典型的例子就是用戶轉(zhuǎn)賬問(wèn)題(A賬戶向B賬號(hào)匯錢(qián)):
1 從A賬號(hào)中把余額讀出來(lái)。
2 對(duì)A賬號(hào)做減法操作。
3 把結(jié)果寫(xiě)回A賬號(hào)中。
4 從B賬號(hào)中把余額讀出來(lái)。
5 對(duì)B賬號(hào)做加法操作。
6 把結(jié)果寫(xiě)回B賬號(hào)中。
為了數(shù)據(jù)的一致性,這6件事,要么操作全部成功,要么全部失敗回滾。這就是事務(wù)的一個(gè)特性:原子性。關(guān)于事務(wù)的四大特性(ACID)這里不做深究。
項(xiàng)目使用的是 Egg+egg-sequelize 模式,查閱了一下 sequelize 的官方文檔,使用方法如下:

// 受管理的事務(wù)(auto-callback)
return sequelize.transaction(function (t) {
  // 要確保所有的查詢鏈都有return返回
  return User.create({
    firstName: 'Abraham',
    lastName: 'Lincoln'
  }, {transaction: t}).then(function (user) {
    return user.setShooter({
      firstName: 'John',
      lastName: 'Boothe'
    }, {transaction: t});
  });
}).then(function (result) {
  // Transaction 會(huì)自動(dòng)提交
  // result 是事務(wù)回調(diào)中使用promise鏈中執(zhí)行結(jié)果
}).catch(function (err) {
  // Transaction 會(huì)自動(dòng)回滾
  // err 是事務(wù)回調(diào)中使用promise鏈中的異常結(jié)果
});

// 不受管理的事務(wù)(then-callback)
return sequelize.transaction().then(function (t) {
  return User.create({
    firstName: 'Homer',
    lastName: 'Simpson'
  }, {transaction: t}).then(function (user) {
    return user.addSibling({
      firstName: 'Lisa',
      lastName: 'Simpson'
    }, {transaction: t});
  }).then(function () {
    return t.commit();
  }).catch(function (err) {
    return t.rollback();
  });
});

使用 ES6 的語(yǔ)法如下:

let transaction;
try {
  transaction = await this.ctx.model.transaction();
  await this.service.xxx.xxx(parms, transaction);
  await this.service.xxx.xxx(parms1, parms2, transaction);
  await transaction.commit();

  return true
} catch (e) {
  await transaction.rollback();

  return false
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 選擇題部分 1.(),只有在發(fā)生短路事故時(shí)或者在負(fù)荷電流較大時(shí),變流器中才會(huì)有足夠的二次電流作為繼電保護(hù)跳閘之用。...
    skystarwuwei閱讀 14,390評(píng)論 0 7
  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚(yú)閱讀 10,592評(píng)論 0 13
  • 一、最簡(jiǎn)單的例子來(lái)說(shuō)明事務(wù) “A賬戶向B賬號(hào)匯錢(qián)”來(lái)說(shuō)明事務(wù) 1、從A賬號(hào)中把余額讀出來(lái)。2、對(duì)A賬號(hào)做減法操作。...
    AQ王浩閱讀 5,756評(píng)論 0 9
  • 大山之下 李彪 大山之下,每日清晨至傍晚,各...
    醉心軒主人閱讀 210評(píng)論 0 0
  • 我的性格是分幾個(gè)階段的,在我的印象中,小學(xué)之前我都是很內(nèi)向的,自從上了初中,不知道什么原因,我好像一下子就開(kāi)朗了,...
    多啦大美夢(mèng)閱讀 374評(píng)論 0 0

友情鏈接更多精彩內(nèi)容