2

我是 Java EE 的初学者,我正在开发一个具有大量数据库操作的 Web 应用程序。我对 Java EE 中的事务感到困惑。

我的问题是我使用的是 Tomcat,我不知道 Java EE 中的事务类型,但我必须在我的项目中使用它们。所以,我已经搜索了很多次,得到了很多“孩子”:

  1. 使用connection.setAutoCommit(false),但它是连接管理的?

  2. 使用Javax.Transaction.UserTransaction

这两者有什么区别,还有其他方法吗?

我正在使用 NetBeans 7.0,并且 Tomcat 与它集成在一起。当我尝试使用javax.transaction.UserTransaction它时,它无法自动完成这个界面,但确实给出了一个建议java.transaction.xa

所以我该怎么做???

注意:我不能使用 EJB,因为 Tomcat 是托管服务器提供给我的 Web 服务器。

4

2 回答 2

2

正如你所指出的。“交易”一词有多种含义。一种流行的含义是数据库事务。

  • 数据库事务是数据库操作的集合,这些操作是原子的(全部成功或全部失败)、一致(数据库必须在事务之前和之后都有效)、隔离(在事务完成之前其他事务可能看不到更改)、并且持久(一旦提交,事务就会持久化)。

这些事务可以在连接级别进行管理,通常使用connection.setAutoCommit(false)connection.commit()connection.rollback()

您发现的另一种事务是 JTA 事务。JTA 事务是一个非常抽象的概念,简单地围绕着一组“操作”。JTA 本身对事务不做任何事情。然而,通常情况下,人们会插入 JTA 资源管理器,这些资源管理器会在事务开始或结束时执行某些操作。

例如,有人可以设置消息资源管理器以确保仅在提交事务时才发送 JMS 消息。当 JTA 事务启动和停止时,也有人可以使用数据库资源管理器来启动和停止数据库事务(如上所述)。

JTA 具有很大的配置开销,并且需要进行大量的设置工作。它通常仅在您需要管理资源集群(例如数据库集群)并在它们之间进行协调时使用。

如果您只有一个数据库,那么您可以直接在 JDBC 上使用事务。如果您在 JDBC 之上使用某些东西(例如 JPA),那么这些工具通常会为您管理事务。

一种流行的方法是使用Spring 托管事务。Spring 与 JTA 类似,因为它具有非常通用的事务定义,但配置起来要容易得多。使用 Spring 有两个明显的优势。首先是它们的事务划分(使用@Transactional 注释)有时比处理提交和回滚要容易得多(不需要有这么多的try/catch/finally 语句)。另一个原因是,如果您最终迁移到集群,您可以稍后随时在 Spring 下插入 JTA。

于 2012-12-07T21:28:58.340 回答
0

默认情况下,Tomcat 中没有容器管理事务——在这种情况下,您必须以与 Java SE 中相同的方式处理事务。这与 EE 无关,因此不能使用 javax.transaction.UserTransaction。

于 2012-12-07T12:16:15.897 回答