2012-12-06 25 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。