sqlx_core/postgres/
transaction.rs1use futures_core::future::BoxFuture;
2
3use crate::error::Error;
4use crate::executor::Executor;
5use crate::postgres::{PgConnection, Postgres};
6use crate::transaction::{
7 begin_ansi_transaction_sql, commit_ansi_transaction_sql, rollback_ansi_transaction_sql,
8 TransactionManager,
9};
10
11pub struct PgTransactionManager;
13
14impl TransactionManager for PgTransactionManager {
15 type Database = Postgres;
16
17 fn begin(conn: &mut PgConnection) -> BoxFuture<'_, Result<(), Error>> {
18 Box::pin(async move {
19 conn.execute(&*begin_ansi_transaction_sql(conn.transaction_depth))
20 .await?;
21
22 conn.transaction_depth += 1;
23
24 Ok(())
25 })
26 }
27
28 fn commit(conn: &mut PgConnection) -> BoxFuture<'_, Result<(), Error>> {
29 Box::pin(async move {
30 if conn.transaction_depth > 0 {
31 conn.execute(&*commit_ansi_transaction_sql(conn.transaction_depth))
32 .await?;
33
34 conn.transaction_depth -= 1;
35 }
36
37 Ok(())
38 })
39 }
40
41 fn rollback(conn: &mut PgConnection) -> BoxFuture<'_, Result<(), Error>> {
42 Box::pin(async move {
43 if conn.transaction_depth > 0 {
44 conn.execute(&*rollback_ansi_transaction_sql(conn.transaction_depth))
45 .await?;
46
47 conn.transaction_depth -= 1;
48 }
49
50 Ok(())
51 })
52 }
53
54 fn start_rollback(conn: &mut PgConnection) {
55 if conn.transaction_depth > 0 {
56 conn.queue_simple_query(&rollback_ansi_transaction_sql(conn.transaction_depth));
57
58 conn.transaction_depth -= 1;
59 }
60 }
61}