当前位置: 首页 > 工具软件 > Speedment > 使用案例 >

使用Speedment 3.0.17及更高版本简化了事务

韩照
2023-12-01

交易次数

有时我们想确保我们的数据库操作是原子执行的,并且与其他操作分开。 这是交易起作用的地方。 交易是一组操作

数据库可能接受或不接受作为原子操作的建议。 因此,要么接受交易中的所有操作,要么不接受交易中的所有操作。 事务的另一个优点是,在事务开始时,数据库的状态将在本地“冻结”,因此在事务中我们不会看到其他线程的更新。

Speedment是一个开源的Stream ORM Java工具包和Runtime Java工具,它将现有数据库及其表包装到Java 8流中。 Speedment的更高版本以易于使用的方式支持数据库事务。

更新

想象一下,我们正在编写一个带有帐户的银行应用程序,然后将100美元从一个帐户(1)转移到另一个(2)。 在这种情况下,重要的是钱不要消失(即从1中扣除,但从未存入2),甚至更糟的是,将重复(即,以2存入但未从1扣除)。 可以使用以下Speedment数据库事务来确保这一点:

txHandler.createAndAccept(tx ->

    Account sender = accounts.stream()
        .filter(Account.ID.equal(1))
        .findAny()
        .get();

    Account receiver = accounts.stream()
        .filter(Account.ID.equal(2))
        .findAny()
        .get();

    accounts.update(sender.setBalance(sender.getBalance() - 100));
    accounts.update(receiver.setBalance(receiver.getBalance() + 100));

    tx.commit();
}

当方法
调用tx.commit() ,这两个更新将自动提交给数据库,并且对所有其他线程可见。 如果我们没有显式调用tx.commit()则事务将自动回滚(即,更新将不起作用,将被丢弃)。

准备工作

在使用事务之前,我们需要获得一个TransactionHandler如下所示:

BankApplication app = ....
    TransactionComponent transactionComponent = app.getOrThrow(TransactionComponent.class);
    TransactionHandler txHandler = transactionComponent.createTransactionHandler();


可以从应用程序中检索AccountManager ,如下所示:

AccountManager accounts = app.getOrThrow(AccountManager.class);

下一步是什么?

此处阅读有关Speedment交易的更多信息

访问GitHub并在此处阅读有关Speedment开源的所有信息。

翻译自: https://www.javacodegeeks.com/2017/11/transactions-made-simple-using-speedment-3-0-17.html

 类似资料: