Database.startTransaction(): Promise<Transaction>

支持端:云函数

开始事务,另一个同样可以使用的发起事务的 API 是 runTransaction。仅可在云函数中使用。

返回值

Promise.<Transaction>

resolve 的结果为事务操作对象,其上可通过 collection API 操作数据库,通过 commitrollback 来结束或终止事务。

限制

事务现仅支持在云函数 wx-server-sdk 使用。事务操作时为保障效率和并发性,只允许进行单记录操作,不允许进行批量操作,但可以在一个事务中对多个记录进行操作。

示例代码

两个账户之间进行转账的简易示例

  1. const cloud = require('wx-server-sdk')
  2. cloud.init({
  3. env: cloud.DYNAMIC_CURRENT_ENV
  4. })
  5. const db = cloud.database({
  6. throwOnNotFound: false,
  7. })
  8. const _ = db.command
  9. exports.main = async (event) => {
  10. try {
  11. const transaction = await db.startTransaction()
  12. const aaaRes = await transaction.collection('account').doc('aaa').get()
  13. const bbbRes = await transaction.collection('account').doc('bbb').get()
  14. if (aaaRes.data && bbbRes.data) {
  15. const updateAAARes = await transaction.collection('account').doc('aaa').update({
  16. data: {
  17. amount: _.inc(-10)
  18. }
  19. })
  20. const updateBBBRes = await transaction.collection('account').doc('bbb').update({
  21. data: {
  22. amount: _.inc(10)
  23. }
  24. })
  25. await transaction.commit()
  26. console.log(`transaction succeeded`)
  27. return {
  28. success: true,
  29. aaaAccount: aaaRes.data.amount - 10,
  30. }
  31. } else {
  32. await transaction.rollback()
  33. return {
  34. success: false,
  35. error: `rollback`,
  36. rollbackCode: -100,
  37. }
  38. }
  39. } catch (e) {
  40. console.error(`transaction error`, e)
  41. return {
  42. success: false,
  43. error: e
  44. }
  45. }
  46. }