You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SurrealDB Transaction正确使用方法咨询:SQL未在事务内执行

SurrealDB Rust客户端事务的正确使用方式

问题核心

你当前的代码错误在于:开启事务后依然直接调用datastore.execute()执行SQL,导致SQL操作完全脱离了事务上下文,事务提交自然不会生效。去掉事务后SQL能正常执行,也侧面验证了这一点——之前的操作根本没关联到你开启的事务上。

错误代码示例:

let mut transaction = datastore.transaction(true, false).await?;

let sql = "CREATE task SET title = $title, due_date = $due_date, create_at = time::now();";

let data: BTreeMap<String, Value> = [
    ("title".into(), task.title.into()),
    ("due_date".into(), task.due_date.into()),
].into();

// 错误:直接调用datastore的execute,未关联到事务
let res = datastore.execute(sql, &session, Some(data), false).await?;

transaction.commit().await?;

debug!("{:?}", res);

正确实现方式

要让SQL操作纳入事务管理,必须调用事务对象自身的execute()方法,而非原datastore实例的方法。修改后的代码如下:

let mut transaction = datastore.transaction(true, false).await?;

let sql = "CREATE task SET title = $title, due_date = $due_date, create_at = time::now();";

let data: BTreeMap<String, Value> = [
    ("title".into(), task.title.into()),
    ("due_date".into(), task.due_date.into()),
].into();

// 正确:使用transaction对象执行SQL,操作纳入事务上下文
let res = transaction.execute(sql, &session, Some(data), false).await?;

transaction.commit().await?;

debug!("{:?}", res);

关键说明

  • 事务开启后,所有需要在事务内执行的SQL操作,都必须通过返回的Transaction实例调用方法,才能绑定到该事务的上下文当中。
  • 如果中途需要取消事务,可以调用transaction.rollback().await?替代commit()。

内容的提问来源于stack exchange,提问作者Trí Phan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:09:24