arangodb erlang数据库驱动
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

202 行
14 KiB

  1. -module(agTransactions).
  2. -include("eArango.hrl").
  3. -compile(inline).
  4. -compile({inline_size, 128}).
  5. -compile([export_all, nowarn_export_all]).
  6. % doc_address:https://www.arangodb.com/docs/stable/http/transaction.html
  7. % 交易的HTTP接口
  8. % 交易次数
  9. % ArangoDB的事务在服务器上执行。交易可以由客户以两种不同的方式执行:
  10. %
  11. % 通过流事务 API
  12. % 通过JavaScript交易 API
  13. % 两者之间的区别不难理解,下面列出了一个简短的入门。有关ArangoDB中事务如何工作以及ArangoDB可以提供哪些保证的详细说明,请参阅Transactions。
  14. %
  15. % 流交易
  16. % 流事务使您可以使用单独的开始和提交/中止命令执行多文档事务。这类似于传统RDBMS使用BEGIN,COMMIT和ROLLBACK操作的方式。
  17. %
  18. % 这是大型交易的推荐API。但是,客户端负责确保不再需要事务时提交或中止事务,以避免占用资源。
  19. %
  20. % JavaScript交易
  21. % JS-Transactions允许您向服务器发送一段专用的JavaScript代码(即一个函数),该代码将以事务方式执行。
  22. %
  23. % 在该功能结束时,将自动提交事务,并且该事务完成的所有更改都将保留。除了初始启动请求之外,客户端不需要任何交互。
  24. % 局限性固定链接
  25. % 在协调器上强制执行流事务的最大生命周期和事务大小,以确保事务不会阻止群集正常运行:
  26. %
  27. % 两次操作之间的最大闲置超时时间为10秒
  28. % 每个数据库服务器的最大事务大小为128 MB
  29. % 这些限制也适用于单个服务器上的流事务。
  30. %
  31. % 强制执行限制对于释放被放弃的事务使用的资源很有用,例如,从由于编程错误而被客户端应用程序放弃的事务中,或者从由于客户端连接中断而留下的事务中释放资源。
  32. % 流事务的HTTP接口
  33. % 在v3.5.0中引入
  34. % 流事务使您可以使用单独的开始和提交/中止命令执行多文档事务。这类似于传统RDBMS使用BEGIN,COMMIT和ROLLBACK操作的方式。
  35. % 要使用流事务,客户端首先将 事务的配置发送到ArangoDB服务器。
  36. % 与JS-Transaction相反,此事务的定义必须仅包含将要使用的集合以及(可选)ArangoDB支持的各种事务选项。不支持任何动作属性。
  37. % 流事务API 与ArangoDB中的其他API 结合使用。要将事务用于支持的操作,客户端需要在每个请求的x-arango-trx-id标头中指定事务标识符。这将自动使这些操作使用指定的事务。
  38. % 支持的事务性API操作包括:
  39. % Document API中的所有操作
  40. % 通过Collection API的文档数
  41. % 通过Collection API截断集合
  42. % 通过Cursor API创建AQL游标
  43. % 处理 托管图的顶点和边(通用图 / Gharial API,从v3.5.1开始)
  44. % 请注意,客户端始终需要首先启动事务,并且需要显式指定用于写访问的集合。客户端负责确保不再需要事务时提交或中止事务。这样可以避免占用ArangoDB服务器上的资源。
  45. % 事务将获取集合锁,用于MMFiles存储引擎中的读写操作以及RocksDB中的写操作。因此,建议尽量缩短交易时间。
  46. % 有关ArangoDB中事务如何工作的更详细描述,请参阅Transactions。
  47. % 另请参阅:
  48. % 局限性
  49. % 已知的问题
  50. % 开始服务器端事务
  51. % POST /_api/transaction/begin
  52. % 具有以下属性的JSON对象是必需的:
  53. % collections:collections必须是一个JSON对象,可以具有一个或所有子属性read,write或Exclusive,每个子属性 都是collection名称的数组或单个collection name作为字符串。必须使用write或Exclusive属性声明将在事务中写入的集合,否则它将失败,而仅从中读取的未声明集合将被延迟添加。有关 更多信息,请参见锁定和隔离。
  54. % waitForSync:一个可选的布尔标志,如果设置了该标志,将强制事务在返回之前将所有数据写入磁盘。
  55. % allowImplicit:允许从未声明的集合中读取。
  56. % lockTimeout:一个可选的数值,可用于设置等待收集锁的超时时间。如果未指定,将使用默认值。将lockTimeout设置为0将使ArangoDB不会在等待锁定时超时。
  57. % maxTransactionSize:事务大小限制(以字节为单位)。仅受RocksDB存储引擎的尊敬。
  58. % 事务描述必须在POST请求的正文中传递。如果可以在服务器上启动事务,则将返回HTTP 201。
  59. % 对于成功启动的事务,返回的JSON对象具有以下属性:
  60. % error:布尔值标志,指示是否发生错误( 在这种情况下为false)
  61. % code:HTTP状态码
  62. % 结果:结果包含
  63. % id:交易的标识符
  64. % status:包含字符串“ running”
  65. % 如果缺少交易规范或格式错误,则服务器将使用HTTP 400或HTTP 404进行响应。
  66. % 然后,响应的主体将包含带有其他错误详细信息的JSON对象。该对象具有以下属性:
  67. % error:布尔值标志,指示发生错误(在这种情况下为true)
  68. % code:HTTP状态码
  69. % errorNum:服务器错误号
  70. % errorMessage:描述性错误消息
  71. % 返回码
  72. % 201:如果事务正在服务器上运行, 则将返回HTTP 201。
  73. % 400:如果事务规范丢失或格式不正确,则服务器将使用HTTP 400进行响应。
  74. % 404:如果事务规范包含未知集合,则服务器将使用HTTP 404进行响应。
  75. beginTransaction(PoolNameOrSocket, MapData) ->
  76. agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/transaction/begin">>, ?AgDefQuery, ?AgDefHeader, eVPack:encode(MapData)).
  77. % 提取服务器端事务的状态
  78. % GET /_api/transaction/{transaction-id}
  79. % 路径参数
  80. % transaction-id(必填):交易标识符。
  81. % 结果是一个描述事务状态的对象。它至少具有以下属性:
  82. % id:交易的标识符
  83. % status:交易的状态。“运行”,“承诺”或“中止”之一。
  84. % 返回码
  85. % 200:如果事务已在服务器上完全执行并提交, 则将返回HTTP 200。
  86. % 400:如果指定的事务标识符丢失或格式错误,则服务器将使用HTTP 400进行响应。
  87. % 404:如果找不到具有指定标识符的交易,则服务器将使用HTTP 404进行响应。
  88. getTransactionStatus(PoolNameOrSocket, TransactionId) ->
  89. Path = <<"/_api/transaction/", (agMiscUtils:toBinary(TransactionId))/binary>>,
  90. agVstCli:callAgency(PoolNameOrSocket, ?AgGet, Path).
  91. % 提交或中止正在运行的事务必须由客户端完成。在完成使用事务后,不要提交或中止事务是一个坏习惯。这将迫使服务器保留资源和收集锁,直到整个事务超时为止。
  92. % 提交交易
  93. % 提交服务器端事务
  94. % PUT /_api/transaction/{transaction-id}
  95. % 路径参数
  96. % transaction-id(必填):交易标识符,
  97. % 提交正在运行的服务器端事务。提交是幂等操作。多次提交事务不是错误。
  98. % 如果可以提交事务,则将返回HTTP 200。返回的JSON对象具有以下属性:
  99. % error:布尔值标志,指示是否发生错误( 在这种情况下为false)
  100. % code:HTTP状态码
  101. % 结果:结果包含
  102. % id:交易的标识符
  103. % status:包含字符串“ committed”
  104. % 如果找不到事务,不允许提交或事务被中止,则服务器将使用HTTP 400,HTTP 404或HTTP 409进行响应。
  105. % 然后,响应的主体将包含带有其他错误详细信息的JSON对象。该对象具有以下属性:
  106. % error:布尔值标志,指示发生错误(在这种情况下为true)
  107. % code:HTTP状态码
  108. % errorNum:服务器错误号
  109. % errorMessage:描述性错误消息
  110. % 返回码
  111. % 200:如果已提交事务, 则将返回HTTP 200。
  112. % 400:如果无法提交事务,则服务器将使用HTTP 400进行响应。
  113. % 404:如果未找到事务,则服务器将使用HTTP 404进行响应。
  114. % 409:如果事务已经中止,则服务器将使用HTTP 409进行响应。
  115. commitTransaction(PoolNameOrSocket, TransactionId) ->
  116. Path = <<"/_api/transaction/", (agMiscUtils:toBinary(TransactionId))/binary>>,
  117. agVstCli:callAgency(PoolNameOrSocket, ?AgPut, Path).
  118. % 中止服务器端事务
  119. % DELETE /_api/transaction/{transaction-id}
  120. % 路径参数
  121. % transaction-id(必填):交易标识符,
  122. % 中止正在运行的服务器端事务。中止是一个幂等的操作。多次中止事务不是错误。
  123. % 如果可以中止该事务,则将返回HTTP 200。返回的JSON对象具有以下属性:
  124. % error:布尔值标志,指示是否发生错误( 在这种情况下为false)
  125. % code:HTTP状态码
  126. % 结果:结果包含
  127. % id:交易的标识符
  128. % status:包含字符串“ aborted”
  129. % 如果找不到事务,不允许中止或已提交事务,则服务器将使用HTTP 400,HTTP 404或HTTP 409进行响应。
  130. % 然后,响应的主体将包含带有其他错误详细信息的JSON对象。该对象具有以下属性:
  131. % error:布尔值标志,指示发生错误(在这种情况下为true)
  132. % code:HTTP状态码
  133. % errorNum:服务器错误号
  134. % errorMessage:描述性错误消息
  135. % 返回码
  136. % 200:如果事务中止, 将返回HTTP 200。
  137. % 400:如果无法中止事务,则服务器将使用HTTP 400进行响应。
  138. % 404:如果未找到事务,则服务器将使用HTTP 404进行响应。
  139. % 409:如果事务已经提交,则服务器将以HTTP 409响应。
  140. abortTransaction(PoolNameOrSocket, TransactionId) ->
  141. Path = <<"/_api/transaction/", (agMiscUtils:toBinary(TransactionId))/binary>>,
  142. agVstCli:callAgency(PoolNameOrSocket, ?AgDelete, Path).
  143. % 返回当前运行的服务器端事务
  144. % GET /_api/transaction
  145. % 结果是一个对象,该对象使用transactions属性进行描述,其中包含一个事务数组。在群集中,阵列将包含来自所有协调器的事务。
  146. % 每个数组条目都包含一个具有以下属性的对象:
  147. % id:交易的ID
  148. % status:交易的状态
  149. % 返回码
  150. % 200:如果可以成功检索事务列表,则将返回HTTP 200。
  151. transactionList(PoolNameOrSocket) ->
  152. agVstCli:callAgency(PoolNameOrSocket, ?AgGet, <<"/_api/transaction">>).
  153. % JavaScript交易的HTTP接口
  154. % ArangoDB的JS事务在服务器上执行。客户端可以通过将事务描述发送给服务器来启动事务。
  155. % ArangoDB中的JS事务不提供单独的BEGIN,COMMIT和ROLLBACK 操作。取而代之的是,ArangoDB JS事务由JavaScript函数描述,然后JavaScript函数中的代码将以事务方式执行。
  156. % 在该功能结束时,将自动提交事务,并且该事务完成的所有更改都将保留。如果在事务执行过程中引发异常,则将回滚事务中执行的所有操作。
  157. % 有关ArangoDB中事务如何工作的更详细描述,请参阅Transactions。
  158. % 执行服务器端事务
  159. % POST /_api/transaction
  160. % 具有以下属性的JSON对象是必需的:
  161. % collections:collections必须是一个JSON对象,可以具有一个或所有子属性read,write或Exclusive,每个子属性 都是collection名称的数组或单个collection name作为字符串。必须使用write或Exclusive属性声明将在事务中写入的集合,否则它将失败,而仅从中读取的未声明集合将被延迟添加。可以将可选的子属性allowImplicit设置为false, 以使事务在未声明声明的读取集合的情况下失败。如果可能,应完全声明要读取的集合,以避免死锁。看到锁定和隔离 以获取更多信息。
  162. % action:要执行的实际交易操作,采用字符串化JavaScript代码的形式。该代码将在服务器端执行,并具有后期绑定。因此,至关重要的是,在操作中指定的代码 正确设置其所需的所有变量。如果操作中指定的代码以return语句结尾, 则如果事务成功提交,则REST API还将在result属性中返回返回的值。
  163. % waitForSync:一个可选的布尔标志,如果设置了该标志,将强制事务在返回之前将所有数据写入磁盘。
  164. % allowImplicit:允许从未声明的集合中读取。
  165. % lockTimeout:一个可选的数值,可用于设置等待收集锁的超时时间。如果未指定,将使用默认值。将lockTimeout设置为0将使ArangoDB不会在等待锁定时超时。
  166. % params:传递给操作的可选参数。
  167. % maxTransactionSize:事务大小限制(以字节为单位)。仅受RocksDB存储引擎的尊敬。
  168. % 事务描述必须在POST请求的正文中传递。
  169. % 如果事务已在服务器上完全执行并提交, 则将返回HTTP 200。另外,在操作中定义的代码的返回值将在result属性中返回。
  170. % 对于成功提交的事务,返回的JSON对象具有以下属性:
  171. % error:布尔值标志,指示是否发生错误( 在这种情况下为false)
  172. % code:HTTP状态码
  173. % result:交易的返回值
  174. % 如果缺少交易规范或格式错误,则服务器将使用HTTP 400进行响应。
  175. % 然后,响应的主体将包含带有其他错误详细信息的JSON对象。该对象具有以下属性:
  176. % error:布尔值标志,指示发生错误(在这种情况下为true)
  177. % code:HTTP状态码
  178. % errorNum:服务器错误号
  179. % errorMessage:描述性错误消息
  180. % 如果事务提交失败(无论是由于操作代码中引发的异常 还是内部错误),服务器都会以错误进行响应。其他任何错误都将使用返回码 HTTP 400,HTTP 409或HTTP 500返回。
  181. % 返回码
  182. % 200:如果事务已在服务器上完全执行并提交, 则将返回HTTP 200。
  183. % 400:如果事务规范丢失或格式不正确,则服务器将使用HTTP 400进行响应。
  184. % 404:如果事务规范包含未知集合,则服务器将使用HTTP 404进行响应。
  185. % 500:用户抛出的异常将使服务器以HTTP 500的返回码进行响应
  186. executeTransaction(PoolNameOrSocket, MapData) ->
  187. agVstCli:callAgency(PoolNameOrSocket, ?AgPost, <<"/_api/transaction">>, ?AgDefQuery, ?AgDefHeader, eVPack:encode(MapData)).