如果可以通过事务或直接连接来调用函数(因此它应该从那里启动一个新事务因为它需要一个新事务)您建议使用什么?
示例代码:
async fn find_player_id_and_assign_goal(
&self,
db: Option<&mut sqlx::PgConnection>,
id: &str,
team_id: &str,
) -> Result<String, Error> {
let mut tx = None;
let db = match db {
Some(db) => {
// I need to detect if `db` here is already a transaction or not, in which case I should start a new one:
db
},
None => &mut *tx.insert(self.pool.begin().await?),
};
let _ = self.team_service.find_team_id(Some(db), team_id).await?;
let player_id = self.repo.find_player_id(Some(db), id).await?;
self.goal_service.assign_to_player(Some(db), id).await?;
if let Some(tx) = tx {
tx.commit().await?;
}
Ok(player_id)
}
这可行,但我只有一个问题:
如果Some(db) => db
我需要检测我们是否已经处于交易中(如果db
是的话)。如果没有,我应该开始一个新的。
您认为有没有更好的方法来实现这一目标?
如果您对 、 和 的内部调用
find_team_id
需要find_player_id
同时assign_to_player
进行db
事务,则只需进行事务即可。支持嵌套事务,因此是否已处于事务中并不重要。