use driver::{Connection, IsolationLevel, TransactionConfig};
pub struct Transaction<'c> {
conn: &'c mut Connection,
committed: bool,
}
impl<'c> Transaction<'c> {
pub async fn begin(conn: &'c mut Connection) -> crate::core::error::Result<Transaction<'c>> {
conn.begin().await?;
Ok(Transaction {
conn,
committed: false,
})
}
pub async fn begin_with(
conn: &'c mut Connection,
isolation: IsolationLevel,
) -> crate::core::error::Result<Transaction<'c>> {
conn.begin_with(TransactionConfig::new().isolation(isolation))
.await?;
Ok(Transaction {
conn,
committed: false,
})
}
pub fn conn(&mut self) -> &mut Connection {
self.conn
}
pub async fn commit(mut self) -> crate::core::error::Result<()> {
self.committed = true;
self.conn.commit().await?;
Ok(())
}
pub async fn rollback(mut self) -> crate::core::error::Result<()> {
self.committed = true; self.conn.rollback().await?;
Ok(())
}
}
impl Drop for Transaction<'_> {
fn drop(&mut self) {
if !self.committed {
#[cfg(debug_assertions)]
eprintln!("WARNING: Transaction dropped without commit — implicit rollback");
}
}
}