【51CTO.com快译】事务的目的是保护数据不会受到数据库无法完成部分更新的影响。事务API现在可用于无代码应用程序。
交易接口
使用事务API,数据库可以执行分组为单个事务的多个数据库请求。当这些分组数据库操作中的任何一个失败时,整个事务都会回滚——这意味着同一事务中的任何更改都将被取消。
到目前为止,事务API仅限于使用代码构建的后端用户。而现在,API也可供无代码开发人员使用。
以下描述了事务API的工作原理及其一些好处。然后,将提供一个以无代码的事务API的示例。
事务的好处
那么,事务API可以做些什么?以下来看看其中的一些好处。
首先,如果任何操作失败,整个事务将回滚——无需从代码中执行任何清理。换句话说,不会对数据库进行永久更改,如果操作失败,则需要修复这些更改。
其次,从客户端的角度来看,只有一个请求发送到服务器——执行事务的请求。例如,假设一个事务执行两个操作:(1)在数据库中保存一个对象;(2)在保存的对象和用查询标识的其他对象之间建立关系。使用事务API,客户端应用程序只向服务器发送一个请求。
第三,事务为数据库提供一致性和参照完整性。换句话说,事务可以确保数据库中没有“脏数据”。这有助于保持客户端代码更清晰和数据一致。
事务API的工作原理
无后端事务依赖于以下概念:
- 工作单元——是事务请求的整个有效负载,它将多个单独的数据库操作组合成一个对象中。添加到工作单元的所有操作都有一个序列号,并且将按照添加顺序在服务器端执行。一个工作单元本质上代表一个事务。
- 数据库操作——在事务中执行的单个操作。这可以是创建、检索、更新、删除和关系管理(创建、更新、删除)操作。
- 操作结果——表示单个数据库操作结果的实体。一个操作的结果可以在其他后续操作中引用。
例如,“创建”操作返回一个结果,这个结果代表着保存在数据库中的对象。可以在操作中引用该对象以设置对象的关系。或者,可以从操作结果中“提取”特定属性的值,并将其用于同一事务中的其他操作。
下图说明了这些相互关联的概念:
工作单元API
无后端事务API的核心是一个名为UnitOfWork的请求。客户端应用程序使用它来组成事务。
组合事务意味着将各种数据库操作添加到一个工作单元中。用于从数据库中检索对象的“查找”操作如上图所示。通过使用一个操作的输出/结果作为另一个操作的输入,这些操作可以相互“链接”。例如,在下图中,看到了一个“更新”操作的示例,其中包含引用事务中先前操作的选项。
当服务器收到UnitOfWork请求时,它开始处理其操作。服务器在单个数据库事务的场景中执行所有操作。
如果所有的操作失败,无后端将回滚所有更改,并将有关每个操作的结果信息返回给客户端。但是,如果所有操作都成功,则提交整个数据库事务。这意味着数据将在数据库中完成更新。
事务隔离
使用后端事务API,可以为其事务配置隔离级别。隔离级别决定了无后端数据库如何将某个事务与同时运行的所有其他事务分开。
如果没有任何隔离,一个事务可以修改另一个事务正在读取的数据,这样做会造成数据不一致。隔离级别决定了其事务与其他事务的隔离程度。这是通过对事务中检索到的数据应用锁定来实现的。不同隔离的级别意味着不同的锁定机制,每个锁定机制也会产生不同的数据读取现象。
操作结果
事务API最强大的元素之一是能够在同一事务内的其他后续操作中使用操作结果。这是通过所有事务操作遵循的“协议”实现的:每个操作都可以有一个唯一的标识符。
标识符可以在另一个操作中使用,以引用使用其操作的结果。这允许产生“链接效应”,其中数据来自一个操作,然后输入到另一个操作中。例如下面的例子。该示例在数据库中保存一个新对象,然后在创建的对象和另一个表中的对象之间建立关系。
将对象保存在数据库中的操作为每个操作分配一个唯一的ID,然后在后续操作中使用这个ID来建立对象与其子对象之间的关系。
无代码事务示例
可以通过以下无代码事务来分解每个步骤中发生的事情。此无代码块用于存储购买的详细信息。以下介绍这个API调用的每一步。
作为参考,本例中两个表的表架构如下所示。以下是这个API服务每个步骤的细分:
首先,在本例中,将创建一个名为TransactionsDemo的API服务,其方法名称为createObjectsSaveRelation。不必创建新的API服务来运行本示例中的逻辑。其所有步骤几乎都可以用于创建的任何无代码逻辑。
接下来,创建一个变量myTx,并将其内容设置为一个新的事务。事务的隔离设置为“可重复读取”。
这是事务的“包装器”。在这里,实现了组成名为myTx的事务(或UnitOfWork)的操作。需要注意的是,顺序很重要。特别是如果操作依赖于同一事务中的另一个操作,则需要确保按正确的顺序排列操作步骤以实现所需的结果。
作为事务中的第一个操作,执行名为createOrderOp的“创建”操作。此操作在Order表中创建一个orderId=061821-CV1和amount=189.2的对象。
对于第二个操作,执行“批量创建”操作并将其命名为createOderItemsOp。在这个操作中,创建了两个数据对象——数量为10的纸巾和数量为20的浴室纸巾。这些项目被添加到表OrderItem中。
最后,执行“SetRelation”操作将子数据对象连接到父数据对象。不需要为此操作命名(id)。对于父级可以访问Order表。然后通过访问createOrderOp操作的结果找到父对象。而正在创建关系的列称为orderDetails。为了找到子选项,将再次访问先前操作的结果。这次是createOrderItemsOp操作。
事务结果
这个API调用的结果将是:
无代码示例表架构
订单表架构:
OrderItem表架构:
原文标题:Transaction API Support for Codeless,作者:Chris Fanchi
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】