2012-12-06 47 views
2

我是Java EE的初學者,我正在開發一個具有大量數據庫操作的Web應用程序。我對Java EE中的事務感到困惑。Java EE中的事務或分佈式事務

我的問題是,我使用的是Tomcat,我不知道Java EE中事務的類型,但是我必須在我的項目中使用它們。所以,我已經搜查了許多遍了,並得到這麼多的那個「kides」:

  1. 使用connection.setAutoCommit(false),但它連接進行管理?

  2. 使用Javax.Transaction.UserTransaction

什麼是這兩者之間的區別,以及是否有任何其他方式?

我使用的是NetBeans 7.0,Tomcat與它集成在一起。當我嘗試使用javax.transaction.UserTransaction時,它無法自動完成此界面,但確實給出了java.transaction.xa的建議;

我該怎麼辦?

注意:我無法使用EJB,因爲Tomcat是由託管服務器提供給我的Web服務器。

+0

你如何與你的數據庫交互?你正在使用JPA或JDBC或JDO或其他層? – Pace

+0

感謝您的幫助 - 實際上我使用的是JDBC mysql驅動程序api – sam

回答

2

正如您所指出的那樣。 「交易」一詞有很多含義。一個流行的含義是數據庫事務。

  • 數據庫事務是原子數據庫操作的集合(要麼全部成功,要麼全部失敗),一致(數據庫必須在交易之前和之後有效),隔離(其它事務可能看不到變化,直到事務完成),並且持久(一旦提交事務被持久化)。

這些事務可以在連接級別進行管理,通常與connection.setAutoCommit(false)connection.commit(),和connection.rollback()

您發現的另一種交易是JTA交易。 JTA交易是一個非常抽象的概念,只是圍繞着一組「操作」。 JTA本身與交易無關。然而,通常情況下,人們會插入JTA資源管理器,這些資源管理器在事務開始或結束時執

例如,有人可以設置消息傳遞資源管理器,以確保只有在提交事務時才發送JMS消息。有人還可以使用數據庫資源管理器在JTA事務啓動和停止時啓動和停止數據庫事務(以上已經描述)。

JTA具有重要的配置開銷,並且可以進行相當多的設置工作。它通常僅用於需要管理資源集羣(如數據庫集羣)並在其中進行協調的情況。

如果您只有一個數據庫,那麼您可以直接在JDBC上使用事務。如果你在JDBC之上使用某些東西(例如JPA),那麼這些工具通常會爲您管理您的交易。

一種流行的方法是使用Spring managed transactions。 Spring與JTA類似,它有一個非常通用的事務定義,但配置起來要容易得多。與Spring一起有兩個明顯的優勢。首先,它們是事務分界(使用@Transactional註釋)有時比處理提交和回滾更容易(不需要具有相當多的try/catch/finally語句)。另一個原因是,如果你最終轉移到集羣,你可以在以後的Spring之下插入JTA。

+0

我們可以給@Transactional並同時爲容器管理的事務配置服務器。 –

+0

我不完全確定那會是什麼樣子。你是說你同時使用EJB和Spring來訪問數據庫嗎?我認爲通過Spring數據庫接口訪問的任何實體都將處於與通過EJB數據庫接口訪問的實體不同的事務和不同的持久化上下文中。 – Pace

0

默認情況下,Tomcat中沒有容器管理的事務 - 在這種情況下,您必須像處理Java SE一樣處理事務。這與EE無關,因此您不能使用javax.transaction.UserTransaction。