2个版本
0.1.1 | 2019年2月28日 |
---|---|
0.1.0 | 2019年2月28日 |
#2504 in 数据库接口
71 每月下载次数
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