交易次数
有时我们想确保我们的数据库操作是原子执行的,并且与其他操作分开。 这是交易起作用的地方。 交易是一组操作
数据库可能接受或不接受作为原子操作的建议。 因此,要么接受事务中的所有操作,要么不接受事务中的所有操作。 事务的另一个优点是,在事务开始时,数据库的状态将在本地“冻结”,因此在事务中我们不会看到其他线程的更新。
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);
下一步是什么?
访问GitHub并在此处阅读有关Speedment开源的所有信息。
翻译自: https://www.javacodegeeks.com/2017/11/transactions-made-simple-using-speedment-3-0-17.html