use rustis::{
Result,
client::{BatchPreparedCommand, Client, ExclusiveClient},
commands::{StringCommands, TransactionCommands},
};
#[tokio::main]
async fn main() -> Result<()> {
let client = Client::connect("127.0.0.1:6379").await?;
let mut transaction = client.create_transaction();
transaction.set("account:a", 100).forget();
transaction.set("account:b", 0).forget();
transaction.execute::<()>().await?;
let client = ExclusiveClient::connect("127.0.0.1:6379").await?;
client.watch("account:a").await?;
let balance: i64 = client.get("account:a").await?;
let transfer = 30;
if balance < transfer {
client.unwatch().await?;
println!("not enough on account:a");
return Ok(());
}
let mut transaction = client.create_transaction();
transaction.set("account:a", balance - transfer).forget();
transaction.incr("account:b").forget();
match transaction.execute::<()>().await {
Ok(()) => println!("transferred {transfer}"),
Err(e) => println!("aborted, someone else wrote first: {e}"),
}
Ok(())
}