TRANSACTION,事务或者交易。SurrealDB 在执行每一条 SurealQL 语句的时候都会创建一个单独的事务,如果执行成功,就会确定提交这次事务,如果声明修改了数据,这些修改也就会生效。如果执行失败了,就会取消事务,对数据的修改也就不会生效。
如果我们要执行一系列的声明,这些声明相互依赖,我们可以把它们组织到一个事务里,这样如果全部声明都被成功执行了,就会确定对数据的修改,如果遇到了问题,数据会回滚到之前的样子。也就是要么一起成功,确定修改,要么就一块失败,好像什么也没有发生一样。
重启 SurrealDB 服务,清空一下数据。在 HTTP 客户端,复制一个请求,名字改成“使用事务”。
这里先用 DEFINE FIELD 定义一个 name 字段,这个字段在 user 这个表里面,把字段的类型设置成 string,然后 ASSERT 这个字段的值不等于 NONE。先执行一下,再注释掉这行声明。
BEGIN,COMMIT
开始一个事务,可以使用 BEGIN TRANSACTION; 事务的结尾,用一下 COMMIT TRANSACTION。在它们之间的东西就是在这个事务里要执行的声明。
先用 CREATE 创建一条 post 数据,id 是 post:1 ,SET 一下 content 属性,设置一下它的值。然后再添加一条声明,用 CREATE 创建一个 user 数据,id 是 user:libai。
然后用 UPDATE 更新一下 post:1,MERGE ,一个对象,里面添加一个 user 属性,值是 user:libai。 执行一下这组声明,得到的响应会提示 The query was not executed due to a failed transaction。意思就是这条声明没能成功被执行,是因为在事务里有执行失败的声明。
这是因为创建这条 user 数据的时候,没有设置 name 这个属性的值,所以这条声明就没能成功执行,Surreal 会回滚整个事务里的声明对数据的修改,恢复成原来的样子。
可以执行一下 SELECT * FROM post; 在这个 post 表里还没有数据记录。
下面再修改一下这个事务里的声明,在 SET 后面,把 name 这个属性的值设置成 '李白',再执行一下。
成功执行了这个事务里的所有声明,对数据的修改也就生效了,你会看到这里提示先创建了一个内容数据,然后创建了一个用户数据,又修改了一下之前创建的这个内容数据。