#事务 #回滚 #钩子 #柴油 #处理程序 #连接 #线程

diesel_transaction_handles

柴油机共享事务处理程序,可选回滚钩子

2个版本

0.1.1 2019年2月28日
0.1.0 2019年2月28日

#2504 in 数据库接口

Download history 113/week @ 2024-03-09 129/week @ 2024-03-16 62/week @ 2024-03-23 53/week @ 2024-03-30 56/week @ 2024-04-06 3/week @ 2024-04-13 51/week @ 2024-04-20 38/week @ 2024-04-27 67/week @ 2024-05-04 40/week @ 2024-05-11 25/week @ 2024-05-18 5/week @ 2024-05-25 9/week @ 2024-06-01 55/week @ 2024-06-08 7/week @ 2024-06-15

71 每月下载次数

MIT 许可证

14KB
242

柴油机事务处理程序

此crate为diesel添加了一种新的Connection类型,本质上是事务性的。它将在创建时打开事务,并在销毁时回滚。提交事务将消耗 self

此功能的典型用例是能够使多个线程在同一事务中执行数据库操作。

此外,通过功能 rollback_hooks,你可以提供在事务回滚时执行的函数。此功能的主要用例是如果你执行了不是对数据库的IO,需要在回滚时撤销的IO,你可以提供回滚到连接所需的操作,如果需要,它将执行。

回滚钩子是后进先出执行的。

用法

将其添加到你的 Cargo.toml

[dependencies]
diesel_transaction_handles = "0.1.0"

示例

#[macro_use]
extern crate failure;

use diesel::prelude::*;
use diesel_transaction_handles::TransactionalConnection;
use std::sync::Arc;
use crate::external;
use crate::schema::things_done;

fn main() {

    let pgcon = diesel::PgConnection::establish("localhost:5432/pgdb").unwrap();
    let txcon = TransactionalConnection::new(pgcon).unwrap();
    let arccon = Arc::new(txcon);

    let arccon_ = arccon.clone();
    let job1 = std::thread::spawn(move || {
        let id = external::do_the_thing().unwrap(3);
        arccon_.add_rollback_hook(|| external::undo_the_thing(id));
        diesel::insert_into(things_done::table).values(things_done::id.eq(id)).execute(&*arccon_)
    });

    let arccon_ = arccon.clone();
    let job2 = std::thread::spawn(move || -> Result<usize, failure::Error> {
        let f = diesel::select(diesel::dsl::sql::<diesel::sql_types::Bool>("FALSE")).load::<bool>(&*arccon_)?;
        bail!("yikes")
    });

    let job1res = job1.join().unwrap();
    let job2res = job2.join().unwrap();
    let res = match (job1res, job2res) {
        (Ok(a), Ok(b)) => Ok((a, b)),
        (Err(e), _) => Err(e),
        (_, Err(e)) => Err(e),
    };
    println!(
        "{:?}",
        Arc::try_unwrap(arccon)
            .map_err(|_| "Arc still held by multiple threads.")
            .unwrap()
            .handle_result(res) // rollback occurs here
    );
}

依赖关系

~3.5MB
~75K SLoC