Java EE或分布式事务中的事务

时间:2012-12-06 16:09:16

标签: java java-ee jta

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

我的问题是我正在使用Tomcat而我不了解Java EE中的事务类型,但我必须在我的项目中使用它们。所以,我已经多次搜索过它并获得了很多“kides”:

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

  2. 使用Javax.Transaction.UserTransaction

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

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

    那我该怎么办?

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

2 个答案:

答案 0 :(得分:2)

正如你所指出的那样。 “" transaction"”这个词有很多含义。一个流行的含义是数据库事务。

  • 数据库事务是原子的数据库操作的集合(全部成功或全部失败),一致(数据库必须在事务之前和之后有效),隔离(其他事务在事务发生之前可能看不到更改)完整),持久(一旦提交事务被保留)。

可以在连接级别管理这些交易,通常使用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。

答案 1 :(得分:0)

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