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
相关产品推荐
相关产品推荐

