(
conn: Arc<Mutex<InnerConnection>>,
backend: DbBackend,
metric_callback: Option<crate::metric::Callback>,
isolation_level: Option<IsolationLevel>,
access_mode:
| 30 | impl DatabaseTransaction { |
| 31 | #[instrument(level = "trace", skip(metric_callback))] |
| 32 | pub(crate) async fn begin( |
| 33 | conn: Arc<Mutex<InnerConnection>>, |
| 34 | backend: DbBackend, |
| 35 | metric_callback: Option<crate::metric::Callback>, |
| 36 | isolation_level: Option<IsolationLevel>, |
| 37 | access_mode: Option<AccessMode>, |
| 38 | ) -> Result<DatabaseTransaction, DbErr> { |
| 39 | let res = DatabaseTransaction { |
| 40 | conn, |
| 41 | backend, |
| 42 | open: true, |
| 43 | metric_callback, |
| 44 | }; |
| 45 | match *res.conn.lock().await { |
| 46 | #[cfg(feature = "sqlx-mysql")] |
| 47 | InnerConnection::MySql(ref mut c) => { |
| 48 | // in MySQL SET TRANSACTION operations must be executed before transaction start |
| 49 | crate::driver::sqlx_mysql::set_transaction_config(c, isolation_level, access_mode) |
| 50 | .await?; |
| 51 | <sqlx::MySql as sqlx::Database>::TransactionManager::begin(c, None) |
| 52 | .await |
| 53 | .map_err(sqlx_error_to_query_err) |
| 54 | } |
| 55 | #[cfg(feature = "sqlx-postgres")] |
| 56 | InnerConnection::Postgres(ref mut c) => { |
| 57 | <sqlx::Postgres as sqlx::Database>::TransactionManager::begin(c, None) |
| 58 | .await |
| 59 | .map_err(sqlx_error_to_query_err)?; |
| 60 | // in PostgreSQL SET TRANSACTION operations must be executed inside transaction |
| 61 | crate::driver::sqlx_postgres::set_transaction_config( |
| 62 | c, |
| 63 | isolation_level, |
| 64 | access_mode, |
| 65 | ) |
| 66 | .await |
| 67 | } |
| 68 | #[cfg(feature = "sqlx-sqlite")] |
| 69 | InnerConnection::Sqlite(ref mut c) => { |
| 70 | // in SQLite isolation level and access mode are global settings |
| 71 | crate::driver::sqlx_sqlite::set_transaction_config(c, isolation_level, access_mode) |
| 72 | .await?; |
| 73 | <sqlx::Sqlite as sqlx::Database>::TransactionManager::begin(c, None) |
| 74 | .await |
| 75 | .map_err(sqlx_error_to_query_err) |
| 76 | } |
| 77 | #[cfg(feature = "mock")] |
| 78 | InnerConnection::Mock(ref mut c) => { |
| 79 | c.begin(); |
| 80 | Ok(()) |
| 81 | } |
| 82 | #[cfg(feature = "proxy")] |
| 83 | InnerConnection::Proxy(ref mut c) => { |
| 84 | c.begin().await; |
| 85 | Ok(()) |
| 86 | } |
| 87 | #[allow(unreachable_patterns)] |
| 88 | _ => Err(conn_err("Disconnected")), |
| 89 | }?; |
no test coverage detected