Se uma função pode ser chamada com uma transação ou uma conexão direta (e portanto deve iniciar uma nova transação a partir daí porque precisa de uma), o que você sugere usar?
Código de exemplo:
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)
}
Isso pode funcionar, mas só tenho um problema:
Se Some(db) => db
eu precisar detectar se já estamos em uma transação (se db
houver). Se não, eu deveria começar um novo.
Você acha que existe uma maneira melhor de fazer isso?
Se suas chamadas internas para
find_team_id
,find_player_id
eassign_to_player
precisarem estar em uma transação juntas, basta fazer uma transação. As transações aninhadas são suportadas, portanto não importa sedb
já está em uma transação ou não.