Skip to content

Latest commit

 

History

History
52 lines (34 loc) · 1.71 KB

transactions.zh.md

File metadata and controls

52 lines (34 loc) · 1.71 KB

使用事务

[![rusqlite-badge]][rusqlite] [![cat-database-badge]][cat-database]

[Connection::open]将打开cats.db —— 来自之前食谱的数据库。

Connection::transaction开始一个事务(transaction)。事务将回滚,除非明确使用Transaction::commit提交。

一次事务,就是一系列对数据库的操作,且明确commit后才会执行。

在下面的示例中,将颜色添加表,该表对颜色名称要唯一,进行约束。当尝试插入重复的颜色时,事务将回滚。

extern crate rusqlite;

use rusqlite::{Connection, Result, NO_PARAMS};

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", NO_PARAMS)?;
    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", NO_PARAMS)?;
    tx.execute("insert into cat_colors (name) values (?1)", &[&"lavender"])?;
    tx.execute("insert into cat_colors (name) values (?1)", &[&"blue"])?;
    tx.execute("insert into cat_colors (name) values (?1)", &[&"lavender"])?;

    tx.commit()
}