直至正文
豫言包府
← 众包

豫言操作系统持久事务 0.2.0

豫言 · 库

在同一持久仓原子读取、写入、删除、列举并返回结构化值,也可在普通持久对象事件中直接访问持久仓。

持久事务之约 0.2.0

此包使客读写当前持久对象(Durable Object)之久仓,并于一原子事务中行多步读写。二版于初版之上惟增其术,旧术之签不易:补事务内之删、列与回滚,又使客于寻常持久对象之事(durable-fetch、durable-alarm、套接字诸事)中,不开事务而径读写久仓。仓中每键之值为一 JSON 值:宿主以结构化值纳于平台之存,故与旧 JavaScript 对象所书之数相通——读出则得其 JSON 文,客书 JSON 文,则旧 JavaScript 读得同一对象。仓惟当前持久对象独有,宿主不得露他对象、他事务之态于调用方。

事务

执行持久事务 以有效 JSON 文为参,于同仓调用客之事务入口(事类 durable-transaction,客循[网页入站之约](../网页入站/规范.文言.md)之事类择入口),成则返入口所定 JSON 果文。入口以 读取持久事务参数 取参;以 读取持久事务键值、写入持久事务键值、删除持久事务键、列举持久事务键值 读写本事务之键;以 回滚持久事务 弃本事务已作之诸写;完成持久事务 每事必且惟一成功。输入 JSON 宿主验之,输出须为有效 JSON。

诸读写属同一原子事务:入口抛错、无果、逾时或仓败,则已写之键、已设或已删之告警皆不得提交。同仓并事串行;事务入口运行之际,宿主不向该对象投他事,他事排队以候(等于[持久独占](../持久独占/规范.文言.md)),故事务中可候外物,然宜短:平台于事务回调逾三十秒则重置整个对象,宿主因限 durable-transaction 之事默为二十五秒(可配,不得逾三十秒),逾时则 执行持久事务 抛可捕之异。回滚持久事务 之后不得再读写本事务之键(平台拒之),入口当即 完成持久事务。事务入口内不得复启事务或[持久独占](../持久独占/规范.文言.md)之区;于事务入口内用[持久告警](../持久告警/规范.文言.md)之术,则告警之设与删与本事务同命:事务提交则行,回滚或败则撤。

执行持久事务 败时(入口抛未捕之异、不曾 完成持久事务、果非 JSON、事务逾时、仓败)抛可以「尝试运行」捕之豫言异,辞以 持久事务失败: 起而存其因;诸写已回滚。入口自抛而未捕之豫言异,出宿主之界则显为 RuntimeError: illegal cast,宿主于辞后附其说;欲告调用者以确因,入口当自以「尝试运行」捕之,而书其因于 完成持久事务 之果。

直读写久仓

读取持久仓键值、写入持久仓键值、删除持久仓键、列举持久仓键值、清空持久仓 使客于寻常持久对象之事中不开事务而径行久仓,常用于只读一键、书毕即返、扫前缀或清库。此五术惟持久对象之事(事类以 durable- 起)可用,不得于 `durable-transaction` 入口内用之(彼处读写必属当前事务),于他事或事务入口内用之,则抛可捕之异。单次调用乃平台一次原子存取;数次直调之间不成事务,其间对象或理他事(惟在[持久独占](../持久独占/规范.文言.md)之区内则否)。

术之总表

| 术 | 用处 | 说 | | --- | --- | --- | | 执行持久事务 | 持久对象之事 | 初版有之;败则改为抛可捕之异 | | 读取持久事务参数、完成持久事务 | 事务入口 | 初版有之 | | 读取持久事务键值、写入持久事务键值 | 事务入口 | 初版有之 | | 删除持久事务键、列举持久事务键值、回滚持久事务 | 事务入口 | 二版新增 | | 读取持久仓键值、写入持久仓键值、删除持久仓键、列举持久仓键值、清空持久仓 | 非事务之持久对象事 | 二版新增 |

读取持久事务键值 与 读取持久仓键值 返存否之标与值之 JSON 文:缺键为阴与空文,已存 JSON null 为阳与 null,二者不混。删除持久事务键 去一键(本无则无事);删除持久仓键 返阳者,键原有也。列举持久事务键值、列举持久仓键值 受选项 JSON 对象文,返 JSON 数组文 [[键,值],…],依键之 UTF-8 字节序而列(reverse 为真则逆序),值乃所存 JSON 值本身,非再编之字符串;事务内之列,得见本事务未提交之写与删。清空持久仓 尽清当前对象之久数(键值;SQLite 之存则并及 SQL 表,告警是否同清,平台依兼容日期而定)。

键、值与列举之选

键依 UTF-8 计,须一至二千零四十八字节。值为有效 JSON 文,不逾二 MiB,嵌套不逾三十二层,且不含宿主所留之单键对象——谓仅一成员而其名为 $句柄、$未定义、$大整数 或 $数字 之对象(此乃宿主与豫言相授异值之记,书之则拒);对象含他成员者,与此数名为字符串值者,皆许。数循 JSON 数之义,绝对值逾 2^53−1 之整数,客当以字符串表之。

列举之选为 JSON 对象文,诸字段皆可省:prefix、start(含)、startAfter(不含)、end(不含)为字符串,空串视同未指;limit 为不小于一之整数;reverse 为布尔。start 与 startAfter 不得并给;见他字段、型不符、limit 小于一,则败。省 limit 则返尽数所合,然果 JSON 文逾八 MiB 则败,客当以 limit 与 startAfter 分页。

败之情形

| 情形 | 类 | | --- | --- | | 键长越界;值非有效 JSON、逾二 MiB、嵌套过深或含留单键对象;列举之选不合;列举之果逾八 MiB | 违约或逾限:抛可捕之豫言异,辞为中文之因 | | 于不许之事中调用(事务术在事务入口外,直读写术在事务入口内或非持久对象之事) | 违约:抛可捕之豫言异 | | 执行持久事务 中入口败、逾时或平台报误 | 抛可捕之豫言异,诸写已回滚 | | 所换文逾宿主之限(十六 MiB)、存后端故障 | 平台或宿主之故:止当前事,豫言不可捕 |

跨宿主之一致

诸实现须守:值以 JSON 之义往返(读取 所得之文与所 写入 之值,于 JSON 意义相等,不承字节相同);缺键与 JSON null 可辨;列举之序、界与 limit 之义如上;事务原子、事务之际他事排队、回滚之后诸写不可见;上述之限与败类。宿主可择异存后端,然不得易此诸可察之果。

一致性样例

设仓空。写入持久仓键值 "p:a" "1"、"p:b" "2"、"p:c" "3" 之后:读取持久仓键值 "p:a" 得(阳,1);读取持久仓键值 "无" 得(阴,空);列举持久仓键值 {"prefix":"p:","limit":2,"reverse":true} 得 [["p:c",3],["p:b",2]];列举持久仓键值 {"prefix":"","startAfter":"p:a"} 得 [["p:b",2],["p:c",3]]。书 null 后读之得(阳,null)。书 {、{"$句柄":"1"} 或二千零四十九字节之键,皆抛异而仓不改。

事务入口内依次 删除持久事务键 "p:a"、写入持久事务键值 "p:d" "4",此时 列举持久事务键值 {"prefix":"p:"} 得 [["p:b",2],["p:c",3],["p:d",4]];完成持久事务 后仓中亦如是。若书 p:e 之后调 回滚持久事务,则仓仍如提交之前。事务入口抛未捕之异,则 执行持久事务 抛以 持久事务失败: 起之异而仓不变。

界

此包不供 SQL、同步事务、批量读写,亦不供 allowConcurrency、noCache、allowUnconfirmed 诸平台之选,二进制与非 JSON 结构化克隆之值亦不供;须此者,客另用适配库。初版借标准库字符串载 JSON 值,客可用豫言 癸象 自析自造;事务重入 _start 乃适配之术,他日可换类型化回调,原子与值义须存。旧数中嵌套逾三十二层之值不可读出,读之则宿主止当前事。宿主之事时限配置(执行配置.json)属宿主之构建,非此接口之事。此包惟用于获授之当前久仓,仓之名与授由宿主及部署之配置定之。

所赖

观包之制

上传之记

今修订:1 ·

  1. 修订 1
    取 ZIP

包之层级

父:豫言操作系统接口

无子包。