使用Speedment實現事務處理

使用Speedment實現事務處理

  • 版權聲明:本文爲博主chszs的原創文章,未經博主允許不得轉載。

一、Speedment介紹

Speedment是一個開源的、基於Java的、流式ORM工具包和運行時工具,它把對現有數據庫和表的各種操作封裝成Java 8的Stream操作。Speedment的新版本還提供了支持數據庫事務處理的便捷操作方式。

Speedment在GitHub的地址:https://github.com/speedment/speedment

一行代碼

搜索時長大於120分鐘的電影。

使用SQL查詢:

SELECT
    `film_id`, `title`, `description`, `release_year`, `language_id`,
    `original_language_id`, `rental_duration`, `rental_rate`, `length`,
    `replacement_cost`, `rating`, `special_features`, `last_update`
FROM
    `sakila`.`film`
WHERE
    (`length` > 120)

使用Speedment:

Optional<Film> longFilm = films.stream()
    .filter(Film.LENGTH.greaterThan(120))
    .findAny();

可見,使用Speedment無需手動編寫SQL語句,而且代碼更簡潔。

二、Speedment實現事務處理

本文講述怎樣學習使用開源的Speedment ORM工具和Java 8/9實現數據庫的事務處理。

有時我們要確保我們的數據庫操作是原子執行的,並且與其他數據庫操作是相互隔離的。這就是事務處理發揮作用的地方。事務處理是一組操作建議,可以被數據庫管理系統視爲原子操作。因此,事物處理中的所有操作要麼都被接受,要麼都不接受。事務處理的另一個優點是事務處理開始時,數據庫的狀態將在本地“凍結”,所以在事務處理中我們不會看到其他線程的更新。

更新

想象一下,假設我們正在填寫一個銀行賬戶操作的申請表,我們想從一個賬戶(1)轉移100美元到另一個賬戶(2)。在這種情況下,最重要的是我們的錢不能丟失(也即從賬戶1中扣除了100美元,但卻沒存入賬戶2中),或者甚至更糟(即賬戶2存入了100美元但不是從賬戶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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章