postgresql 如何将闭包连接对象传递给Async方法进行Postgress事务回滚

t8e9dugd  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(119)

在Postgres中,我有许多SQL事务,这些事务是从不同的线程执行的,如果任何一个失败,都需要回滚所有事务
代码是这样的-

dbconn.transaction::<_, DieselError, _>(  |conn| {

  tokio::spawn( insert_salary_table(conn) );
  tokio::spawn( insert_user_table(conn) );
  tokio::spawn( insert_user_table(conn) );

}

字符串
这里的问题是,我不能从事务闭包块中借用conn对象
任何建议都会很有帮助。
注意事项:没有时雄::spawn它是工作的,但我的要求,根据用例使用一个javascript调用。我试图从runtime.block_on()调用这些javascript函数,但面临同样的错误。

oogrdqng

oogrdqng1#

你可以通过使用diesel-async crate在Diesel的事务中执行async操作:

use scoped_futures::ScopedFutureExt;
use diesel_async::AsyncConnection;

dbconn.transaction::<(), DieselError, _>(|conn| async move {
    insert_salary_table(conn).await?;
    insert_user_table(conn).await?;
    insert_user_table(conn).await?;

    Ok(())
}.scope_boxed()).await;

字符串
参考transaction的文档了解更多信息。因为你的函数是async,它们应该在它们内部使用RunQueryDsl的柴油机版本,以避免阻塞你的执行器。
.从不同线程执行的事务,如果任何一个事务失败,则需要回滚所有事务。
这将不会使您的事务成为多线程的,也不可能。提供的conn是独占引用,因此不能同时在两个地方使用。

相关问题